2009-10-21 86 views
56

Tôi có lẽ nên biết điều này, nhưng tôi không chắc chắn và tôi không thấy tài liệu đó.System.Diagnostics.Debug.WriteLine trong mã sản xuất

Tôi sử dụng System.Diagnostics.Debug.WriteLine khá thường xuyên trong quá trình phát triển để có thể theo dõi các thay đổi đối với các biến hoặc ngoại lệ khi tôi đang gỡ lỗi mã. Điều này có nghĩa là để làm cho sự phát triển và hiểu những gì đang xảy ra dễ dàng hơn chỉ trong quá trình phát triển. Tôi thường bình luận ra mã hoặc xóa nó khi tôi đi vào sản xuất.

Tôi tự hỏi điều gì xảy ra nếu tôi quên bình luận mã. Ví dụ: giả sử rằng trong chu kỳ phát triển, tôi đang theo dõi thông tin lỗi có thể ghi nhật ký kết nối đến cửa sổ đầu ra bằng cách sử dụng Debug.Write Line. Điều này rõ ràng là OK trong khi phát triển, nhưng tôi tự hỏi nếu tôi đi trực tiếp, nếu có nguy cơ ở đây. Ai đó có thể đính kèm một trình gỡ lỗi vào thực thi trực tiếp của tôi và bẫy đầu ra này? Hoặc là nó một cái gì đó mà chỉ sản xuất đầu ra trong Visual Studio?

Và điều gì sẽ xảy ra khi chúng tôi chuyển từ gỡ lỗi sang bản phát hành? Liệu mã này có bị bỏ qua bởi trình biên dịch nếu chúng ta biên dịch để phát hành không?

+1

Cảm ơn tất cả những ai đã trả lờ[email protected] Devaney, @Mitch Wheat, và @ Agent_9191 tất cả đã đưa ra khá nhiều câu trả lời giống nhau trong các từ ngữ khác nhau, vì vậy tôi sẽ bỏ phiếu cho bạn tất cả, nhưng tôi chỉ có thể chấp nhận một câu trả lời. Tôi sẽ đi với người trả lời đầu tiên, nhưng đó có vẻ là một tie betwee nMitch và Phil, vì vậy không có hành vi phạm tội, Mitch, nhưng tôi sẽ cung cấp cho nó để Phil, có điểm thấp hơn. – David

+0

Đối với những người khác đang tìm kiếm [Debug.WriteLine trong bản phát hành bản phát hành] sau đây (http://stackoverflow.com/questions/5419534/debug-writeline-in-release-build) cũng có thể là một điều thú vị. –

Trả lời

66

Tất cả các thành viên trong lớp Debug được đánh dấu bằng ConditionalAttribute, vì vậy trang web cuộc gọi sẽ không được biên soạn thành Bản dựng phát hành.

+23

Tôi ước mình có một đô la cho mỗi lần một đồng nghiệp gửi một trình cài đặt sản xuất với bản dựng Debug trong đó. – MusiGenesis

17

System.Diagnostics.Debug cuộc gọi phương thức chỉ xuất hiện khi biểu tượng biên dịch có điều kiện "DEBUG" được xác định. Theo mặc định, biểu tượng "DEBUG" chỉ được định nghĩa để gỡ lỗi xây dựng.

Trình biên dịch hỗ trợ ConditionalAttribute bỏ qua các cuộc gọi đến những phương pháp trừ khi "DEBUG" là định nghĩa là một biểu tượng biên soạn có điều kiện.

+1

+1 để thoát 'nhập mã tại đây' :) –

11

Vì tất cả các phương pháp gỡ lỗi đều có thuộc tính [Điều kiện ("DEBUG")], nếu bạn chuyển từ Debug sang Release, bạn sẽ không phải lo lắng về việc các cuộc gọi đến các phương thức đó sẽ bị xóa (cùng với các tối ưu hóa khác của bản dựng Bản phát hành).

+2

Cụ thể hơn, không xác định 'DEBUG'. Nếu bạn tạo một bản phát hành "Release" (các ký hiệu tối thiểu, mã được tối ưu hóa, vv) nhưng xác định 'DEBUG', các phương thức' Debug' sẽ vẫn được gọi, đúng không? –

1

Hầu hết tất cả thành viên của Debug đều được đánh dấu bằng ConditionalAttribute. Các trình biên dịch như C# sẽ bỏ qua các cuộc gọi đến các phương thức đó trong khi xây dựng bản phát hành, vì vậy bạn đang ở bên an toàn.

thông tin

Chế độ ở đây: http://msdn.microsoft.com/en-us/library/system.diagnostics.debug.aspx

2

Cung cấp cho bạn biên dịch mà không có sự lựa chọn /d:DEBUG hoặc #define DEBUG, các cuộc gọi WriteLine của bạn sẽ không thể chất hiện diện trong mã phát hành của bạn; không có cách nào để bất kỳ bên thứ ba nào phục hồi bất kỳ thông tin nào từ các cuộc gọi này, vì chúng thực sự không có trong phiên bản phát hành.

Xem thêm chi tiết ở đây: Debug Class (System.Diagnostics) on MSDN

6

thông tin gỡ lỗi là chỉ hiển thị khi bạn đang chạy trong chế độ gỡ lỗi . Ở Chế độ phát hành không có báo cáo Gỡ lỗi sẽ hiển thị (bạn có thể sử dụng Dấu vết thay vì Gỡ lỗi nếu bạn muốn các câu lệnh này hiển thị trong Chế độ phát hành).

http://support.microsoft.com/kb/815788

Các vấn đề liên quan