Являются ли Debug.Assert / Debug.Fail автоматически условно скомпилированными, если "DEBUG" - PullRequest
6 голосов
/ 08 марта 2009

Является ли Debug.Assert / Debug.Fail автоматически условно скомпилированным #if "DEBUG"? Или это больше похоже на то, что если отладчик не подключен (даже в выпуске), он просто ничего не делает? Если да, то влияют ли они на производительность, если оставить их в своем коде? Или они действительно не должны быть в рабочем коде, только в тестовом или условном коде?

Ответы [ 3 ]

16 голосов
/ 08 марта 2009

Нет, весь вызов, включая оценку выражения, удаляется из компиляции, если символ не определен. Это очень важно - если в выражении есть какие-либо побочные эффекты, они не произойдут , если DEBUG не определен. Вот короткая, но полная программа для демонстрации:

using System;
using System.Diagnostics;

class Test
{
    static void Main()
    {
        int i = 0;
        Debug.Assert(i++ < 10);
        Console.WriteLine(i);
    }
}

Если определено DEBUG, выводится 1, в противном случае выводится 0.

Из-за такого поведения в условно скомпилированном методе не может быть параметра out:

using System;
using System.Diagnostics;

class Test
{
    static void Main()
    {
        int i ;
        MethodWithOut(out x);
    }

    [Conditional("FOO")]
    static void MethodWithOut(out int x)
    {
        x = 10;
    }
}

Это дает ошибку:

Test.cs (13,6): ошибка CS0685: условный член 'Test.MethodWithOut (out int)' не может есть выходной параметр

6 голосов
/ 08 марта 2009

API Debug.Assert / Fail содержат атрибут ConditionalAttribute со значением «DEBUG», как, например,

[Conditional("DEBUG")]
public void Assert(bool condition)

Компилятор C # и VB фактически будет включать вызов метода is, только если константа DEBUG определена, когда вызов метода компилируется в коде. Если его нет, вызов метода будет опущен из IL

2 голосов
/ 08 марта 2009

Да, в значительной степени. Методы Debug имеют атрибут [Conditional ("DEBUG")], поэтому вызовы методов Debug не будут компилироваться в IL, если определен символ DEBUG.

Дополнительная информация о Условный атрибут в MSDN.

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