Каково использование директивы препроцессору ОТЛАДКИ #if в C#? Когда мы должны использовать это?

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

12
задан Brian Tompsett - 汤莱恩 8 July 2016 в 20:20
поделиться

5 ответов

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

#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

25
ответ дан 2 December 2019 в 03:02
поделиться

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

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

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

17
ответ дан 2 December 2019 в 03:02
поделиться

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

5
ответ дан 2 December 2019 в 03:02
поделиться

При компиляции вы можете установить флаги компилятора, которые вы можете использовать для помещения кода в эти директивы. Этот код не будет компилироваться и никогда не попадет в окончательный вывод сборки. 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
ответ дан 2 December 2019 в 03:02
поделиться

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

3
ответ дан 2 December 2019 в 03:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: