2009-02-20 73 views
2

如果我在Visual Studio中爲我的C#項目定義調試常量,我可以確定斷言將被評估,並且在失敗時顯示一個消息框。但是什麼標誌,屬性使CLR在運行時實際上決定是否評估和顯示斷言。 DEBUG定義時,斷言代碼是否在IL中結束?或者它是彙編的DebuggableAttribute中關鍵點DebuggableAttribute.DebuggingModes標誌?如果是這樣,它的枚舉值必須存在嗎?這是如何工作的?是什麼讓CLR顯示斷言?

回答

5

如果在未定義DEBUG預處理器符號的情況下進行編譯,則任何對Debug.Assert的調用都將從編譯代碼中忽略。

如果你看docs for Debug.Assert你會發現它有[ConditionalAttribute("DEBUG")]的聲明。 ConditionalAttribute用於決定編譯時是否實際發出方法調用。

如果一個條件屬性意味着沒有進行調用,那麼任何參數評估也會被忽略。這裏有一個例子:

using System; 
using System.Diagnostics; 

class Test 
{ 
    static void Main() 
    { 
     Foo(Bar()); 
    } 

    [Conditional("TEST")] 
    static void Foo(string x) 
    { 
     Console.WriteLine("Foo called"); 
    } 

    static string Bar() 
    { 
     Console.WriteLine("Bar called"); 
     return ""; 
    } 
} 

當定義的測試,這兩種方法分別稱爲:

c:\Users\Jon> csc Test.cs /d:TEST 
c:\Users\Jon> test.exe 
Bar called 
Foo called 

當測試沒有定義,也不叫:

c:\Users\Jon> csc Test.cs /d:TEST 
c:\Users\Jon> test.exe 
2

對System.Diagnostics.Debug類和DEBUG定義的方法的ConditionalAttribute。