2011-12-15 20 views
10

Tôi đã bắt đầu sử dụng một lớp xác định như sau:Defines.Debug vs # nếu DEBUG

internal sealed class Defines 
{ 
    /// <summary> 
    /// This constant is set to true iff the define DEBUG is set. 
    /// </summary> 
    public const bool Debug = 
    #if DEBUG 
    true; 
    #else 
    false; 
    #endif 
} 

Những lợi thế tôi thấy là:

  1. Đảm bảo tôi không phá vỡ thứ mà với #if .. # else .. # endif sẽ không được kiểm tra bởi trình biên dịch.
  2. Tôi có thể thực hiện tìm tham chiếu để xem nơi sử dụng.
  3. Thường hữu ích khi có một bool để gỡ lỗi, định nghĩa mã dài hơn/lộn xộn hơn.

có thể thiệt thòi tôi thấy:

trình biên dịch không thể tối ưu hóa mã không sử dụng nếu lớp Định nghĩa là trong lắp ráp khác. Đó là lý do tại sao tôi đã thực hiện nội bộ.

Tôi có thiếu bất kỳ nhược điểm nào khác không?

[Chỉnh sửa] Ví dụ điển hình của việc sử dụng:

private readonly Permissions _permissions = Defines.Debug ? Permissions.NewAllTrue() 
                  : Permissions.NewAllFalse(); 

Hoặc:

var str = string.Format(Defines.Debug ? "{0} {1} ({2})" : "{0} {1}", actual, text, advance); 
+6

Bạn đã xem ['ConditionalAttribute'] (http://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute.aspx) chưa? – Oded

+0

@Oded Cảm ơn, tôi đã thêm các ví dụ điển hình, chỉ là những sửa đổi nhỏ trong các dòng đơn, không phải toàn bộ các phương thức hay lớp mà ConditionalAttribute phù hợp, hoặc tôi không nên lười biếng và định nghĩa hai phương thức cho các dòng này? – weston

+1

Điều gì sẽ xảy ra nếu assembly có chứa cái này được xây dựng trong 'Debug' nhưng những cái tham chiếu nó được xây dựng trong' Release'? – Oded

Trả lời

6

tôi thấy ít nhất một nhược điểm lớn: nếu Debug là sai, mã này sẽ gây ra một cảnh báo:

if (Debug) 
    Console.WriteLine("Debug"); 

Bởi vì trình biên dịch sẽ phát hiện rằng điều kiện không bao giờ được đáp ứng, do đó,Cuộc gọikhông thể truy cập được.

+0

Ồ vâng, điều đó rất khó chịu. Tôi nghĩ tôi sẽ xem xét đề xuất của @Oded sau đó. – weston

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