#define
Обратите внимание на отсутствие точки с запятой в конце этого оператора. Между директивой #defineи идентификатором может быть любое количество пробелов, но после самого идентификатора должен следовать только символ новой строки. Так, для определения идентификатораEXPERIMENTALслужит следующая директива.
#define EXPERIMENTAL
ПРИМЕЧАНИЕ
В C/C++ директива #define может использоваться для подстановки исходного текста, например для определения имени значения, а также для создания макрокоманд, похожих на функции. А в C# такое применение директивы #define не поддерживается. В этом языке директива #define служит только для определения идентификатора.
Директивы #if и #endif
Обе директивы, #if и#endif,допускают условную компиляцию последовательности кода в зависимости от истинного результата вычисления выражения, включающего в себя один или несколько идентификаторов. Идентификатор считается истинным, если он определен, а иначе — ложным. Так, если идентификатор определен директивой#define,то он будет оценен как истинный. Ниже приведена общая форма директивы#if.
#if
Если
Идентификаторное выражение может быть простым, как наименование идентификатора. В то же время в нем разрешается применение следующих операторов: !, ==, ! =, & & и | |, а также круглых скобок.
Ниже приведен пример применения упомянутых выше директив.
// Продемонстрировать применение директив // #if, #endif и #define.
#define EXPERIMENTAL
using System;
class Test {
static void Main() {
#if EXPERIMENTAL
Console.WriteLine("Компилируется для экспериментальной версии."); #endif
Console.WriteLine("Присутствует во всех версиях.");
}
}
Этот код выдает следующий результат.
Компилируется для экспериментальной версии.
Присутствует во всех версиях.
В приведенном выше коде определяется идентификаторEXPERIMENTAL.Поэтому когда в этом коде встречается директива #i f, идентификаторное выражение вычисляется как истинное и затем компилируется первый оператор, содержащий вызов методаWriteLine (). Если же удалить определение идентификатораEXPERIMENTALи перекомпилировать данный код, то первый оператор, содержащий вызов методаWriteLine (), не будет скомпилирован, поскольку идентификаторное выражение директивы #i fвычисляется как ложное. Но второй оператор, содержащий вызов методаWriteLine(), компилируется в любом случае, потому что он не входит в блок директивы#if.