2009-02-20 7 views
2

Si je définis la constante Débogage de mon projet C# dans Visual Studio, je peux être sûr que les assertions seront évaluées et qu'une boîte de message sera affichée en cas d'échec. Mais quel drapeau, attribut fait le CLR à l'exécution effectivement décider si une assertion est évaluée et affichée. Est-ce que le code d'assertion ne finit pas dans l'IL lorsque DEBUG est défini? Ou est-ce le drapeau DebuggableAttribute.DebuggingModes dans le DebuggableAttribute de l'assemblée le point crucial? Si oui, quelle valeur en doit-il être présent? Comment cela fonctionne-t-il sous le capot?Qu'est-ce qui fait que le CLR affiche des assertions?

Répondre

5

Si vous compilez sans le symbole de préprocesseur DEBUG défini, tous les appels à Debug.Assert seront omis du code compilé. Si vous regardez le docs for Debug.Assert, vous verrez qu'il a [ConditionalAttribute("DEBUG")] sur la déclaration. ConditionalAttribute est utilisé pour décider si un appel de méthode est réellement émis ou non au moment de la compilation.

Si un attribut conditionnel signifie que l'appel n'est pas effectué, toute évaluation d'argument est également omise. Voici un exemple:

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

Lorsque le test est défini, les deux méthodes sont appelées:

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

Lorsque le test est pas défini, ni est appelé:

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

ConditionalAttribute sur les méthodes de la classe System.Diagnostics.Debug et DEBUG définies.