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

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

<b>// Присвоить классу Counter псевдоним Ctr.</b>

<b>using Ctr = Counter;</b>

<b>namespace Counter {</b>

<b>  // Простой вычитающий счетчик,</b>

<b>  class CountDown { int val;</b>

<b>    public CountDown(int n) {</b>

<b>      val = n;</b>

<b>    }</b>

<b>    //...</b>

<b>  }</b>

<b>}</b>

<b>// Объявить еще один класс CountDown, принадлежащий </b>

<b>// глобальному пространству имен,</b>

<b>class CountDown {</b>

<b>  int val;</b>

<b>  public CountDown(int n) {</b>

<b>    val = n;</b>

<b>  }</b>

<b>  // ...</b>

<b>}</b>

<b>class GlobalAliasQualifierDemo {</b>

<b>  static void Main() {</b>

<b>    // Здесь описатель :: предписывает компилятору использовать</b>

<b>    // класс CountDown из пространства имен Counter.</b>

<b>    Ctr::CountDown cd1 = new Ctr::CountDown(10);</b>

<b>    // Далее создать объект класса CountDown из </b>

<b>    // глобального пространства имен.</b>

<b>    global::CountDown cd2 = new global::CountDown(10) ;</b>

<b>    // ...</b>

<b>  }</b>

<b>}</b>

Обратите внимание на то, что идентификатор global служит для доступа к классу CountDown из используемого по умолчанию пространства имен.

<b>global::CountDown cd2 = new global::CountDown(10) ;</b>

Этот подход можно распространить на любую ситуацию, в которой требуется указывать используемое по умолчанию пространство имен.

И последнее: описатель псевдонима пространства имен можно применять вместе с псевдонимами типа extern, как будет показано в главе 20.

Препроцессор

В C# определен ряд директив препроцессора, оказывающих влияние на интерпретацию исходного кода программы компилятором. Эти директивы определяют порядок интерпретации текста программы перед ее трансляцией в объектный код в том исходном файле, где они появляются. Термин директива препроцессора появился в связи с тем, что подобные инструкции по традиции обрабатывались на отдельной стадии компиляции, называемой препроцессором. Обрабатывать директивы на отдельной стадии препроцессора в современных компиляторах уже не нужно, но само ее название закрепилось.

Ниже приведены директивы препроцессора, определенные в С#.

<b># define</b>

<b>#elif</b>

<b>#else</b>

<b>#endif</b>

<b>#endregion</b>

<b>#error</b>

<b>#if</b>

<b>#line</b>

<b>#pragma</b>

<b>#region</b>

<b>#undef</b>

<b>#warning</b>

Все директивы препроцессора начинаются со знака #. Кроме того, каждая директива препроцессора должна быть выделена в отдельную строку кода.

Принимая во внимание современную объектно-ориентированную архитектуру языка С#, потребность в директивах препроцессора в нем не столь велика, как в языках программирования предыдущих поколений. Тем не менее они могут быть иногда полезными, особенно для условной компиляции. В этом разделе все директивы препроцессора рассматриваются по очереди.

Директива #define определяет последовательность символов, называемую идентификатором. Присутствие или отсутствие идентификатора может быть определено с помощью директивы #if или #elif и поэтому используется для управления процессом компиляции. Ниже приведена общая форма директивы #define.

<b>#define идентификатор</b>

Обратите внимание на отсутствие точки с запятой в конце этого оператора. Между директивой #define и идентификатором может быть любое количество пробелов, но после самого идентификатора должен следовать только символ новой строки. Так, для определения идентификатора EXPERIMENTAL служит следующая директива.

<b>#define EXPERIMENTAL</b>

------------------------------------

ПРИМЕЧАНИЕ

В C/C++ директива #define может использоваться для подстановки исходного текста, например для определения имени значения, а также для создания макрокоманд, похожих на функции. А в C# такое применение директивы #define не поддерживается. В этом языке директива #define служит только для определения идентификатора.

------------------------------------

Обе директивы, #if и #endif, допускают условную компиляцию последовательности кода в зависимости от истинного результата вычисления выражения, включающего в себя один или несколько идентификаторов. Идентификатор считается истинным, если он определен, а иначе — ложным. Так, если идентификатор определен директивой #define, то он будет оценен как истинный. Ниже приведена общая форма директивы #if.