Console.WriteLine("Присутствует во всех версиях.");
}
}
Этот код выдает следующий результат.
Компилируется для экспериментальной версии.
Присутствует во всех версиях.
В приведенном выше коде определяется идентификаторEXPERIMENTAL.Поэтому когда в этом коде встречается директива #i f, идентификаторное выражение вычисляется как истинное и затем компилируется первый оператор, содержащий вызов методаWriteLine . Если же удалить определение идентификатораEXPERIMENTALи перекомпилировать данный код, то первый оператор, содержащий вызов методаWriteLine , не будет скомпилирован, поскольку идентификаторное выражение директивы #i fвычисляется как ложное. Но второй оператор, содержащий вызов методаWriteLine, компилируется в любом случае, потому что он не входит в блок директивы#if.
Как пояснялось выше, в директиве #i fдопускается указывать идентификаторное выражение. В качестве примера рассмотрим следующую программу.
// Использовать идентификаторное выражение.
#define EXPERIMENTAL #define TRIAL
class Test {
static void Main {
#if EXPERIMENTAL
Console.WriteLine("Компилируется для экспериментальной версии."); #endif
#if EXPERIMENTAL && TRIAL
Console.Error.WriteLine("Проверка пробной экспериментальной версии. ") ;
#endif
Console.WriteLine("Присутствует во всех версиях.");
}
}
Эта программа дает следующий результат.
Компилируется для экспериментальной версии.
Проверка пробной экспериментальной версии.
Присутствует во всех версиях.
В данном примере определены два идентификатора:EXPERIMENTALиTRIAL.Второй оператор, содержащий вызов методаWriteLine , компилируется лишь в том случае, если определены оба идентификатора.
Для компилирования кода в том случае, если идентификатор не определен, можно воспользоваться оператором !, как в приведенном ниже примере.
#if !EXPERIMENTAL
Console.WriteLine("Этот код не экспериментальный!");
#endif
Вызов метода будет скомпилирован только в том случае, если идентификаторEXPERIMENTAL
Директивы #else и #elif
Директива#elseдействует аналогично условному операторуelseязыка С#, определяя альтернативный ход выполнения программы, если этого не может сделать директива#if. С учетом директивы#elseпредыдущий пример программы может быть расширен следующим образом.
// Продемонстрировать применение директивы #else.
#define EXPERIMENTAL
using System;
class Test {
static void Main {
#if EXPERIMENTAL
Console.WriteLine("Компилируется для экспериментальной версии.");
#else
Console.WriteLine("Компилируется для окончательной версии.");
#endif
#if EXPERIMENTAL && TRIAL