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