Что такое директива препроцессора DEBUG в C # Когда мы должны использовать это? - PullRequest
12 голосов
/ 18 мая 2010

Как используется директива препроцессора #if DEBUG в C #? Когда мы должны использовать это?

Ответы [ 5 ]

24 голосов
/ 18 мая 2010

В режиме отладки:

#if DEBUG
            System.Console.WriteLine("Debug version");
#endif
            System.Console.WriteLine("Output");

Вывод как

Debug version
Output

В режиме выпуска:

#if DEBUG
            System.Console.WriteLine("Debug version");
#endif
            System.Console.WriteLine("Output");

Вывести как

   Output

прочитайте это: # if (C # Reference)

Использование: Если у вас есть набор значений для тестирования в режиме отладки, а не в режиме выпуска, вы можете использовать #if DEBUG

17 голосов
/ 18 мая 2010

Вы можете чувствовать себя более комфортно с атрибутом Conditional, который можно использовать для исключения целых методов без необходимости усложнять источник условными выражениями на вызывающей стороне:

[Conditional("DEBUG")]
void Foo()
{
}

Foo() можно безопасно вызывать как в режиме отладки, так и в выпуске, однако в режиме выпуска это может быть отключено.

5 голосов
/ 18 мая 2010

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

В качестве примера использования: в одной из текущих разработок мы используем флаг компилятора, чтобы указать, следует ли использовать маску входа в систему для входа в систему пользователя или вход в систему должен происходить автоматически с текущим участником. Второй режим предназначен только для разработчиков, например. отладка быстрее без входа в систему.

Другой пример: в некотором монокоде вы увидите флаги. В этом случае код может быть скомпилирован по-разному, например, когда предназначается для другой структуры, поскольку она использует классы, которые могут не существовать в более ранних выпусках.

С этим связан Условный -атрибут, с помощью которого можно пометить метод. Если указанный флаг не установлен, вызовы метода не будут выполняться. Метод все еще заканчивается в IL, но вызовы будут удалены.

Проверьте, например, следующий код:

var mthods = typeof (Debug).GetMethods().Where(mi => mi.Name.Equals("WriteLine")).ToList();
var attribs = mthods[0].GetCustomAttributes(true);

Вы заметите, что к методу Debug.WriteLine применен атрибут Conditional: вызовы к нему будут удалены при компиляции БЕЗ флага компилятора DEBUG.

5 голосов
/ 18 мая 2010

Вам не нужно использовать его вообще. Цель этого - иметь фрагменты кода, которые компилируются только в режиме отладки. например у вас может быть какой-то код, который включает главного пользователя, который может выдавать себя за любого другого пользователя в системе для тестирования и отладки. Вы не хотели бы, чтобы этот пользователь был включен в коде выпуска из соображений безопасности, поэтому вы должны обернуть соответствующие разделы кода в #if DEBUG, и они будут исключены из кода выпуска.

3 голосов
/ 18 мая 2010

это также пригодится при тестировании служб Windows. Вы можете вставить #if DEBUG для запуска вашего процесса вручную, чтобы вам не приходилось устанавливать сервис и подключаться к нему для отладки.

...