C# 4.0 полное руководство - 2011
Шрифт:
#if !EXPERIMENTAL
Console.WriteLine("Этот код не экспериментальный!");
#endif
Вызов метода будет скомпилирован только в том случае, если идентификатор EXPERIMENTAL не определен.
Директивы #else и #elif
Директива #else действует аналогично условному оператору 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 идентификаторное_выражение последовательность операторов #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("Присутствует во всех версиях.");
}
}
Этот код выдает следующий результат.
Компилируется для окончательной версии.
Присутствует во всех версиях.
Директива #undef
С помощью директивы #undef удаляется определенный ранее идентификатор. Это, по существу, означает, что он становится "неопределенным". Ниже приведена общая форма директивы #undef.
#undef идентификатор
Рассмотрим следующий пример кода.
#define SMALL
#if SMALL // . . .
#undef SMALL
// теперь идентификатор SMALL не определен.
После директивы #undef идентификатор SMALL уже оказывается неопределенным.
Директива #undef применяется главным образом для локализации идентификаторов только в тех фрагментах кода, в которых они действительно требуются.
Директива #еггог
Директива #error вынуждает компилятор прервать компиляцию. Она служит в основном для отладки. Ниже приведена общая форма директивы #еггог.
#еггог сообщение_об_ошибке