Добавить в цитаты Настройки чтения

Страница 248 из 502

<b>#if идентификаторное_выражение </b>

<b>последовательность операторов </b>

<b>#endif</b>

Если идентификаторное_выражение, следующее после директивы #if, истинно, то компилируется код (последовательность операторов), указываемый между ним и директивой #endif. В противном случае этот промежуточный код пропускается. Директива #endif обозначает конец блока директивы #if.

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

Ниже приведен пример применения упомянутых выше директив.

<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(&quot;Компилируется для экспериментальной версии.&quot;); </b>

<b>    #endif</b>

<b>    Console.WriteLine(&quot;Присутствует во всех версиях.&quot;);</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(&quot;Компилируется для экспериментальной версии.&quot;);</b>

<b>    #endif</b>

<b>    #if EXPERIMENTAL &amp;&amp; TRIAL</b>

<b>    Console.Error.WriteLine(&quot;Проверка пробной экспериментальной версии. &quot;) ;</b>

<b>    #endif</b>

<b>    Console.WriteLine(&quot;Присутствует во всех версиях.&quot;);</b>

<b>  }</b>

<b>}</b>

Эта программа дает следующий результат.

<b>Компилируется для экспериментальной версии.</b>

<b>Проверка пробной экспериментальной версии.</b>

<b>Присутствует во всех версиях.</b>

В данном примере определены два идентификатора: EXPERIMENTAL и TRIAL. Второй оператор, содержащий вызов метода WriteLine(), компилируется лишь в том случае, если определены оба идентификатора.

Для компилирования кода в том случае, если идентификатор не определен, можно воспользоваться оператором !, как в приведенном ниже примере.

<b>#if !EXPERIMENTAL</b>

<b>Console.WriteLine(&quot;Этот код не экспериментальный!&quot;);</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(&quot;Компилируется для экспериментальной версии.&quot;);</b>

<b>    #else</b>

<b>    Console.WriteLine(&quot;Компилируется для окончательной версии.&quot;);</b>

<b>    #endif</b>