Идентификаторное выражение может быть простым, как наименование идентифи катора. В то же время в нем разрешается применение следующих операторов: !, ==, !=, && и ||, а также круглых скобок.

Ниже приведен пример применения упомянутых выше директив. // Продемонстрировать применение директив // #if, #endif и #define. #define EXPERIMENTAL using System; class Test { static void Main { #if EXPERIMENTAL Console.WriteLine("Компилируется для экспериментальной версии."); #endif Console.WriteLine("Присутствует во всех версиях."); } }

Этот код выдает следующий результат. Компилируется для экспериментальной версии. Присутствует во всех версиях.

В приведенном выше коде определяется идентификатор EXPERIMENTAL. Поэтому когда в этом коде встречается директива #if, идентификаторное выражение вычис ляется как истинное и затем компилируется первый оператор, содержащий вызов метода WriteLine. Если же удалить определение идентификатора EXPERIMENTAL и перекомпилировать данный код, то первый оператор, содержащий вызов метода WriteLine, не будет скомпилирован, поскольку идентификаторное выражение ди рективы #if вычисляется как ложное. Но второй оператор, содержащий вызов метода WriteLine, компилируется в любом случае, потому что он не входит в блок дирек тивы #if.

Как пояснялось выше, в директиве #if допускается указывать идентификаторное выражение. В качестве примера рассмотрим следующую программу. // Использовать идентификаторное выражение. #define EXPERIMENTAL #define TRIAL using System; 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 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.

Перейти на страницу:

Похожие книги