В данном примере определены два идентификатора: EXPERIMENTAL и TRIAL. Второй оператор, содержащий вызов метода WriteLine()
, компилируется лишь в том случае, если определены оба идентификатора.
Для компилирования кода в том случае, если идентификатор не определен, можно воспользоваться оператором !, как в приведенном ниже примере.
#if !EXPERIMENTAL
Console.WriteLine("Этот код не экспериментальный!");
#endif
Вызов метода будет скомпилирован только в том случае, если идентификатор EXPERIMENTAL
Директива #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
Console.Error.WriteLine("Проверка пробной экспериментальной версии.");
#else
Console.Error.WriteLine("Это не пробная экспериментальная версия.");
#endif
Console.WriteLine("Присутствует во всех версиях.");
}
}
Вот к какому результату приводит выполнение этой программы.
Компилируется для экспериментальной версии.
Это не пробная экспериментальная версия.
Присутствует во всех версиях.
В данном примере идентификатор TRIAL не определен, и поэтому часть #else
второй условной последовательности кода не компилируется.
Обратите внимание на то, что директива #else
обозначает конец блока директивы #if и в то же время — начало блока самой директивы #else
. Это необходимо потому, что с любой директивой #if
может быть связана только одна директива #endif
. Более того, с любой директивой #if
может быть связана только одна директива #else
.
Обозначение #elif
означает "иначе если", а сама директива #elif
определяет последовательность условных операций if-else-if
для многовариантной компиляции. После директивы #elif
указывается идентификаторное выражение. Если это выражение истинно, то компилируется следующий далее кодовый блок, а остальные выражения директивы #elif
не проверяются. В противном случае проверяется следующий по порядку блок. Если же ни одну из директив #elif
не удается выполнить, то при наличии директивы #else
выполняется последовательность кода, связанная с этой директивой, а иначе не компилируется ни один из кодовых блоков директивы #if
. Ниже приведена общая форма директивы #elif
.
#if идентификаторное_выражение
последовательность операторов
#elif идентификаторное_выражение
последовательность операторов
#elif идентификаторное_выражение
последовательность операторов // . . .
#endif
В приведенном ниже примере демонстрируется применение директивы #elif
.
// Продемонстрировать применение директивы #elif.
#define RELEASE
using System;
class Test {
static void Main() {
#if EXPERIMENTAL
Console.WriteLine("Компилируется для экспериментальной версии.");
#elif RELEASE
Console.WriteLine("Компилируется для окончательной версии.");
#else
Console.WriteLine("Компилируется для внутреннего тестирования.");
#endif
#if TRIAL && !RELEASE
Console.WriteLine("Пробная версия. ") ;
#endif
Console.WriteLine("Присутствует во всех версиях.");
}
}
Этот код выдает следующий результат.
Компилируется для окончательной версии.
Присутствует во всех версиях.