2009-02-20 5 views
2

Если я определяю константу Debug для моего проекта C# в визуальной студии, я могу быть уверен, что утверждения будут оцениваться, и при сбое отображается сообщение. Но какой флаг, атрибут делает CLR во время выполнения фактически определяет, оценивается и отображается ли утверждение. Не указывает ли код утверждения не в IL, когда DEBUG определен? Или это флаг DebuggableAttribute.DebuggingModes в DebuggableAttribute сборки - важный момент? Если да, то какое значение перечисления должно присутствовать? Как это работает под капотом?Что делает подтверждения CLR Assertions?

ответ

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 ""; 
    } 
} 

Когда TEST определен, оба метода называются:

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

Когда TEST не не определен, ни называют:

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

ConditionalAttribute о методах System.Diagnostics. Определены класс класса и DEBUG.