Чтение онлайн

на главную

Жанры

Полное руководство. С# 4.0
Шрифт:

Обратите внимание на то, что идентификатор global служит для доступа к классу CountDown из используемого по умолчанию пространства имен. global::CountDown cd2 = new global::CountDown(10);

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

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

В С# определен ряд директив препроцессора, оказывающих влияние на интерпре тацию исходного кода программы компилятором. Эти директивы

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

Ниже приведены директивы препроцессора, определенные в С#. #define #elif #else #endif #endregion #error #if #line #pragma #region #undef #warning

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

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

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

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

ПРИМЕЧАНИЕ В C/C++ директива #define может использоваться для подстановки исходного текста, на пример для определения имени значения, а также для создания макрокоманд, похожих на функции. А в C# такое применение директивы #define не поддерживается. В этом языке директива #define служит только для определения идентификатора. Директивы #if и #endif

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

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

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

Ниже приведен пример применения упомянутых выше директив. // Продемонстрировать применение директив // #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("Присутствует во всех версиях."); } }

Поделиться:
Популярные книги

Смертник из рода Валевских. Книга 1

Маханенко Василий Михайлович
1. Смертник из рода Валевских
Фантастика:
фэнтези
рпг
аниме
5.40
рейтинг книги
Смертник из рода Валевских. Книга 1

Я еще не князь. Книга XIV

Дрейк Сириус
14. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще не князь. Книга XIV

Восход. Солнцев. Книга VI

Скабер Артемий
6. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга VI

Без шансов

Семенов Павел
2. Пробуждение Системы
Фантастика:
боевая фантастика
рпг
постапокалипсис
5.00
рейтинг книги
Без шансов

Гром над Империей. Часть 2

Машуков Тимур
6. Гром над миром
Фантастика:
фэнтези
попаданцы
5.25
рейтинг книги
Гром над Империей. Часть 2

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан

Я все еще граф. Книга IX

Дрейк Сириус
9. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я все еще граф. Книга IX

Камень. Книга восьмая

Минин Станислав
8. Камень
Фантастика:
фэнтези
боевая фантастика
7.00
рейтинг книги
Камень. Книга восьмая

Царь поневоле. Том 1

Распопов Дмитрий Викторович
4. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Царь поневоле. Том 1

Старатель 3

Лей Влад
3. Старатели
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Старатель 3

Хуррит

Рави Ивар
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Хуррит

Обыкновенные ведьмы средней полосы

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Обыкновенные ведьмы средней полосы

Пенсия для морского дьявола

Чиркунов Игорь
1. Первый в касте бездны
Фантастика:
попаданцы
5.29
рейтинг книги
Пенсия для морского дьявола

Не ангел хранитель

Рам Янка
Любовные романы:
современные любовные романы
6.60
рейтинг книги
Не ангел хранитель