Полное руководство. С# 4.0 - Шилдт Герберт
Шрифт:
Интервал:
Закладка:
Вот к какому результату приводит выполнение этой программы.Компилируется для экспериментальной версии.Это не пробная экспериментальная версия.Присутствует во всех версиях.
В данном примере идентификатор TRIAL не определен, и поэтому часть #else второй условной последовательности кода не компилируется.
Обратите внимание на то, что директива #else обозначает конец блока директивы #if и в то же время — начало блока самой директивы #else. Это необходимо потому, что с любой директивой #if может быть связана только одна директива #endif. Более того, с любой директивой #if может быть связана только одна директива #else.
Обозначение #elif означает "иначе если", а сама директива #elif определяет последовательность условных операций if-else-if для многовариантной компиляции.После директивы #elif указывается идентификаторное выражение. Если это выражение истинно, то компилируется следующий далее кодовый блок, а остальные выражения директивы #elif не проверяются. В противном случае проверяется следующийпо порядку блок. Если же ни одну из директив #elif не удается выполнить, то приналичии директивы #else выполняется последовательность кода, связанная с этой директивой, а иначе не компилируется ни один из кодовых блоков директивы #if.
Ниже приведена общая форма директивы #elif.#if идентификаторное_выражение последовательность операторов#elif идентификаторное_выражение последовательность операторов#elif идентификаторное_выражение последовательность операторов // ...#endif
В приведенном ниже примере демонстрируется применение директивы #elif.// Продемонстрировать применение директивы #elif.#define RELEASEusing System;class Test { static void Main() { #if EXPERIMENTAL Console.WriteLine("Компилируется для экспериментальной версии."); #elif RELEASE Console.WriteLine("Компилируется для окончательной версии."); #else Console.WriteLine("Компилируется для внутреннего тестирования."); #endif #if TRIAL && !RELEASE Console.WriteLine("Пробная версия."); #endif Console.WriteLine("Присутствует во всех версиях."); }}
Этот код выдает следующий результат.Компилируется для окончательной версии.Присутствует во всех версиях.Директива #undef
С помощью директивы #undef удаляется определенный ранее идентификатор.Это, по существу, означает, что он становится "неопределенным". Ниже приведена общая форма директивы #undef.#undef идентификатор
Рассмотрим следующий пример кода.#define SMALL#if SMALL // ...#undef SMALL// теперь идентификатор SMALL не определен.
После директивы #undef идентификатор SMALL уже оказывается неопределенным.
Директива #undef применяется главным образом для локализации идентификаторов только в тех фрагментах кода, в которых они действительно требуются.Директива #error
Директива #error вынуждает компилятор прервать компиляцию. Она служит восновном для отладки. Ниже приведена общая форма директивы #error.#error сообщение_об_ошибке
Когда в коде встречается директива #error, выводится сообщение об ошибке. Например, когда компилятору встречается строка кода#error Это тестовая ошибка!
компиляция прерывается и выводится сообщение "Это тестовая ошибка!".Директива #warning
Директива #warning действует аналогично директиве #error, за исключениемтого, что она выводит предупреждение, а не ошибку. Следовательно, компиляция непрерывается. Ниже приведена общая форма директивы #warning.#warning предупреждающее_сообщениеДиректива #line
Директива #line задает номер строки и имя файла, содержащего эту директиву.Номер строки и имя файла используются при выводе ошибок или предупрежденийво время компиляции. Ниже приведена общая форма директивы #line.#line номер "имя_файла"
Имеются еще два варианта директивы #line. В первом из них она указывается сключевым словом default, обозначающим возврат нумерации строк в исходное состояние, как в приведенном ниже примере.#line default
А во втором варианте директива #line указывается с ключевым словом hidden.При пошаговой отладке программы строки кода, находящиеся между директивой#line hidden
и следующей директивой #line без ключевого слова hidden, пропускаются отладчиком.Директивы #region и #endregion
С помощью директив #region и #endregion определяется область, которая разворачивается или сворачивается при структурировании исходного кода в интегрированной среде разработки Visual Studio. Ниже приведена общая форма этих директив:#region текст // последовательность кода#endregion текст
где текст обозначает необязательную символьную строку.Директива #pragma
С помощью директивы #pragma инструкции задаются компилятору в виде опций.Ниже приведена общая форма этой директивы:#pragma опция
где опция обозначает инструкцию, передаваемую компилятору.
В текущей версии C# предусмотрены две опции для директивы #pragma. Перваяиз них, warning, служит для разрешения или запрета отдельных предупреждений состороны компилятора. Она принимает две формы:#pragma warning disable предупреждения#pragma warning restore предупреждения
где предупреждения обозначает разделяемый запятыми список номеров предупреждений. Для отмены предупреждения используется опция disable, а для его разрешения — опция restore.
Например, в приведенной ниже директиве #pragma запрещается выдача предупреждения №168, уведомляющего о том, что переменная объявлена, но не используется.#pragma warning disable 168
Второй для директивы #pragma является опция checksum. Она служит для формирования контрольной суммы в проектах ASP.NET. Ниже приведена ее общая форма:#pragma checksum "имя_файла" "{GUID}" "контрольная_сумма"
где имяфайла обозначает конкретное имя файла; GUID — глобально уникальныйидентификатор, с которым связано имяфайла; контрольная_сумма — шестнадцатеричное число, представляющее контрольную сумму. У этой контрольной суммы должно быть четное число цифр.Сборки и модификатор доступа internal
Сборка является неотъемлемой частью программирования на С#. Она представляетсобой один или несколько файлов, содержащих все необходимые сведения о развертывании программы и ее версии. Сборки составляют основу среды .NET. Они предоставляют механизмы для надежного взаимодействия компонентов, межъязыковой возможности взаимодействия и управления версиями. Кроме того, сборки определяютобласть действия программного кода.
Сборка состоит из четырех разделов. Первый раздел представляет собой декларацию сборки. Декларация содержит сведения о самой сборке. К этой информации относится, в частности, имя сборки, номер ее версии, сведения о соответствии типови параметры культурной среды (язык и региональные стандарты). Второй разделсборки содержит метаданные типов, т.е. сведения о типах данных, используемых впрограмме. Среди прочих преимуществ метаданные типов способствуют межъязыковой возможности взаимодействия. Третий раздел сборки содержит программныйкод в формате MSIL (Microsoft Intermediate Language — промежуточный язык корпорации Microsoft). И четвертый раздел сборки содержит ресурсы, используемые программой.
Правда, при программировании на C# сборки получаются автоматически, требуяот программирующего лишь минимальных усилий. Дело в том, что исполняемыйфайл, создаваемый во время компиляции программы на С#, на самом деле представляет собой сборку, содержащую исполняемый код этой программы, а также другиевиды информации. Таким образом, когда компилируется программа на С#, сборкаполучается автоматически.
У сборок имеется много других особенностей, и с ними связано немало актуальныхвопросов программирования, но, к сожалению, их обсуждение выходит за рамки этойкниги. Ведь сборки являются неотъемлемой частью процесса разработки программного обеспечения в среде .NET, но формально они не относятся к средствам языка С#.Тем не менее в C# имеется одно средство, непосредственно связанное со сборкой. Этомодификатор доступа internal, рассматриваемый в следующем разделе.Модификатор доступа internal