Trong nhiều năm, tôi đã sử dụng hằng số trình biên dịch DEBUG trong VB.NET để ghi các thông điệp vào bàn điều khiển. Tôi cũng đã sử dụng System.Diagnostics.Debug.Write theo cách tương tự. Nó luôn luôn là sự hiểu biết của tôi rằng khi RELEASE được sử dụng như là tùy chọn xây dựng, rằng tất cả các câu lệnh này đều được trình biên dịch bỏ sót, giải phóng mã sản xuất của bạn về chi phí của các lệnh debug. Gần đây, khi làm việc với Silverlight 2 Beta 2, tôi nhận thấy rằng Visual Studio thực sự gắn liền với một bản dựng RELEASE mà tôi đang chạy khỏi một trang web công cộng và hiển thị các câu lệnh DEBUG mà tôi cho là không được biên dịch! Bây giờ, khuynh hướng đầu tiên của tôi là giả định rằng có điều gì đó sai trái với môi trường của tôi, nhưng tôi cũng muốn hỏi bất kỳ ai có kiến thức sâu về System.Diagnostics.Debug và tùy chọn xây dựng DEBUG nói chung những gì tôi có thể hiểu nhầm ở đây.Trình biên dịch .NET - DEBUG so với RELEASE
Trả lời
Các phương pháp ưa thích là để thực sự sử dụng thuộc tính có điều kiện để bọc các cuộc gọi gỡ lỗi của bạn, không sử dụng các chỉ thị của trình biên dịch. #ifs có thể gặp khó khăn và có thể dẫn đến các vấn đề xây dựng lạ.
Một ví dụ của việc sử dụng một thuộc tính có điều kiện như sau (trong C#, nhưng hoạt động trong VB.NET quá):
[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
// do stuff
}
Khi bạn biên dịch mà không cần tập DEBUG cờ, bất kỳ cuộc gọi đến WriteDebug sẽ được gỡ bỏ như đã được giả định đã xảy ra với Debug.Write().
Trong kinh nghiệm của tôi, lựa chọn giữa Debug và Release trong VB.NET không có sự khác biệt. Bạn có thể thêm các hành động tùy chỉnh cho cả hai cấu hình, nhưng theo mặc định, tôi nghĩ chúng giống nhau.
Sử dụng Bản phát hành chắc chắn sẽ không xóa các câu lệnh System.Diagnostics.Debug.Write.
Chúng không giống nhau; và Chế độ phát hành theo mặc định thực sự loại bỏ các cuộc gọi đến Debug.Write vì ConditionalAttribute được áp dụng cho phương thức. –
Những gì tôi làm là tóm lược các cuộc gọi để gỡ rối trong lớp học của riêng tôi và thêm một chỉ thị precompiler
public void Debug(string s)
{
#if DEBUG
System.Diagnostics.Debug(...);
#endif
}
Sử dụng biểu tượng trình biên dịch DEBUG sẽ, như bạn nói, thực sự bỏ qua các mã từ lắp ráp.
Tôi tin rằng System.Diagnostics.Debug.Write sẽ luôn xuất ra một trình gỡ rối đính kèm, ngay cả khi bạn đã xây dựng trong chế độ Phát hành. Mỗi số MSDN article:
Ghi thông tin về gỡ lỗi cho trình theo dõi trong bộ sưu tập Người nghe.
Nếu bạn không muốn bất kỳ đầu ra, bạn sẽ cần phải quấn cuộc gọi của bạn để Debug.Write với DEBUG hằng như Juan nói:
#if DEBUG
System.Diagnostics.Debug.Write(...);
#endif
Tôi cũng đọc bài báo này, và điều đó khiến tôi tin rằng khi DEBUG không được định nghĩa, ConditionalAttribute được khai báo trên System.Debug sẽ làm cho trình biên dịch loại bỏ hoàn toàn mã này. Tôi cho rằng điều tương tự cũng đúng với TRACE. Đó là, các hàm System.Diagnostics.Debug phải có ConditionalAttributes cho DEBUG và cho TRACE. Tôi đã sai trong giả định đó. Lớp Trace riêng biệt có các hàm giống nhau và các hàm này định nghĩa ConditionalAttribute phụ thuộc vào hằng số TRACE.
Từ System.Diagnostics.Debug: _ Công Shared Viết Sub (_ nhắn As String _ )
Từ System.Diagnostics.Dấu vết: _ Công Shared Sub WriteLine (_ nhắn As String _ )
Có vẻ như sau đó giả định ban đầu của tôi là đúng, rằng System.Diagnostics.Debug (hoặc system.Diagnostics.Trace) tuyên bố đang thực sự không được bao gồm trong quá trình biên dịch như thể chúng được bao gồm trong các khu vựC#IF DEBUG (hoặC#IF TRACE).
Nhưng tôi cũng đã học được ở đây từ các bạn và đã xác minh rằng bản dựng RELEASE không tự lo về vấn đề này. Ít nhất với các dự án Silverlight, mà vẫn còn một chút flaky, bạn cần phải nhận được vào "Tùy chọn biên dịch nâng cao ..." và chắc chắn rằng DEBUG không được xác định.
Chúng tôi đã tăng từ .NET 1.1/VS2003 lên .NET 3.5/VS2008 vì vậy tôi nghĩ một số điều này được sử dụng để hoạt động khác nhau, nhưng có lẽ nó đã thay đổi trong 2.0/VS2005.
Kiểm tra phương thức Debug.Write. Nó được đánh dấu bằng thuộc tính
[Conditional("DEBUG")]
.
MSDN giúp đỡ cho ConditionalAttribute trạng thái:
Chỉ để trình biên dịch rằng một phương pháp cuộc gọi hoặc thuộc tính nên bỏ qua trừ khi một quy định biểu tượng biên soạn có điều kiện được định nghĩa.
Cấu hình xây dựng có nhãn phát hành hay gỡ lỗi không quan trọng, điều quan trọng là liệu biểu tượng DEBUG có được xác định trong đó hay không.
Để chọn xem bạn muốn biên soạn thông tin gỡ lỗi hay bị xóa,
nhập tab "Xây dựng" trong cửa sổ thuộc tính của dự án.
Chọn cấu hình phù hợp (Active/Release/Debug/All) và đảm bảo rằng bạn kiểm tra "DEBUG Constant" nếu bạn muốn thông tin, hoặc bỏ chọn nếu bạn không.
Áp dụng thay đổi và xây dựng lại
Tuyệt vời ... yêu thích học các thủ đoạn nhỏ mới !! – BigBlondeViking
Tôi nghĩ rằng việc sử dụng 'ConditionalAttribute' có nghĩa là phương thức vẫn là một phần của bản phát hành thực sự, nó không được nạp vào. Vì vậy, tôi sẽ tưởng tượng cách duy nhất * đúng * của việc gỡ bỏ mã gỡ rối là sử dụng các chỉ thị của trình biên dịch? – James