Конечно. Они относятся к условным символам компиляции , которые могут быть определены во время компиляции и которые управляют тем, какой код фактически создается. Вот пример:
using System;
class Test
{
static void Main()
{
#if FOO
Console.WriteLine("FOO was defined");
#endif
#if BAR
Console.WriteLine("BAR was defined");
#endif
}
}
Если вы скомпилируете это с
csc Test.cs
Это ничего не напечатает. Если вы скомпилируете это с
csc Test.cs /D:FOO
тогда будет напечатано "FOO был определен" - и, очевидно, то же самое верно для BAR.
Обратите внимание, что это не то же самое, что макросы C ++ - символ либо определен, либо нет; оно не имеет «заменяющей стоимости» как таковой.
В Visual Studio вы указываете, какие символы должны быть определены на вкладке «Построение» свойств проекта. Кроме того, в самом начале файла вы можете явно определить и отменить определение символов:
#define FOO
#undef BAR
Это может быть важно при вызове методов, оформленных ConditionalAttribute
- такие вызовы игнорируются компилятором, если соответствующий символ не определен. Поэтому, если вы хотите убедиться, что все ваши Debug.Print
звонки были выполнены, даже если вы не определили символ DEBUG для остальной части проекта, вы можете использовать:
#define DEBUG
...
Debug.Print("Foo");
Лично я не очень все это использую. Помимо всего прочего, это облегчает понимание кода, если вы знаете, что он все будет скомпилирован и запущен во время выполнения.
РЕДАКТИРОВАТЬ: Просто для пояснения терминологии - #if
, #line
, #pragma
и т. Д. Являются директивами препроцессора; FOO и BAR (в данном случае) - условные символы компиляции.