Что заставляет CLR показывать утверждения? - PullRequest
2 голосов
/ 20 февраля 2009

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

Ответы [ 2 ]

5 голосов
/ 20 февраля 2009

Если вы компилируете без определенного символа препроцессора DEBUG, любые вызовы Debug.Assert будут пропущены в скомпилированном коде.

Если вы посмотрите документы для 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 голосов
/ 20 февраля 2009

Условный атрибут для методов класса System.Diagnostics.Debug и DEBUG.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...