Полное руководство. С# 4.0
Шрифт:
Директива #undef применяется главным образом для локализации идентификато ров только в тех фрагментах кода, в которых они действительно требуются. Директива #error
Директива #error вынуждает компилятор прервать компиляцию. Она служит в основном для отладки. Ниже приведена общая форма директивы #error. #error сообщение_об_ошибке
Когда в коде встречается директива #error, выводится сообщение об ошибке. На пример, когда компилятору встречается строка кода #error Это тестовая ошибка!
компиляция прерывается и выводится сообщение "Это тестовая ошибка!". Директива #warning
Директива #warning действует аналогично директиве #error, за исключением того, что она выводит предупреждение,
Директива #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
Помимо модификаторов доступа public, private и protected, использовав шихся в представленных ранее примерах программ, в C# предусмотрен также моди фикатор доступа internal. Этот модификатор определяет доступность члена во всех файлах сборки и его недоступность за пределами сборки. Проще говоря, о члене, обо значенном как internal, известно только в самой программе, но не за ее пределами. Модификатор доступа internal особенно полезен для создания программных ком понентов.
Модификатор доступа internal можно применять к классам и их членам, а также к структурам и членам структур. Кроме того, модификатор internal разрешается использовать в объявлениях интерфейсов и перечислений.
Из модификаторов protected и internal можно составить спаренный модифи катор доступа protected internal. Уровень доступа protected internal может быть задан только для членов класса. Член, объявленный как protected internal, доступен лишь в пределах собственной сборки или для производных типов.
Ниже приведен пример применения модификатора доступа internal. // Использовать модификатор доступа internal. using System; class InternalTest { internal int x; } class InternalDemo { static void Main { InternalTest ob = new InternalTest; ob.x = 10; // доступно, потому что находится в том же файле Console.WriteLine("Значение ob.x: " + ob.x); } }
В классе InternalTest поле х объявляется как internal. Это означает, что поле х доступно в самой программе, но, как показывает код класса InternalDemo, оно недо ступно за пределами программы.
ГЛАВА 17. Динамическая идентификация типов, рефлексия и атрибуты
В этой главе рассматриваются три эффективных сред ства: динамическая идентификация типов, рефлексия и атрибуты. Динамическая идентификация типов пред ставляет собой механизм, позволяющий определить тип данных во время выполнения программы. Рефлексия — это средство для получения сведений о типе данных. Используя эти сведения, можно конструировать и применять объекты во время выполнения. Это довольно эффективное средство, поскольку оно дает возможность расширять функции про граммы динамически, т.е. в процессе ее выполнения. Атри бут описывает характеристики определенного элемента программы на С#. Атрибуты можно, в частности, указать для классов, методов и полей. Во время выполнения про граммы разрешается опрашивать атрибуты для получения сведений о них. Для этой цели в атрибутах используется динамическая идентификация типов и рефлексия. Динамическая идентификация типов