Как правильно писать тесты 46 Цикл разработки 46 Структура проекта с тестами 51 Утверждения (Asserts) 52 Утверждения в форме ограничений 54 Категории 56

Вид материалаТесты

Содержание


Пример позиционного атрибута
Создание атрибута
Составляющие класса атрибута
Подобный материал:
1   ...   32   33   34   35   36   37   38   39   ...   47

Атрибуты22




Атрибуты – это способ добавления к классам метаданных. Атрибут можно представить как тег, в котором закладывается дополнительная информация о классах, перечислениях и других элементах C#. Эту информацию можно извлекать в процессе работы программы.

Атрибуты могут служить способом документирования кода. Информация, заложенная в атрибутах, хранится в метаданных элементов, с которыми атрибуты ассоциированы.

В .NET Framework существует ряд предопределенных атрибутов.


Синтаксис


Атрибут задается в квадратных скобках [ ]:



Если нужно задать несколько атрибутов:

можно использовать несколько пар квадратных скобок,

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


Иногда нужно явно указывать имя элемента, с которым ассоциирован атрибут.


Параметры атрибута делятся на позиционные и именованные.

Позиционные параметры похожи на параметры методов. Они должны идти перед именованными параметрами и служат для передачи существенной информации. Именованные параметры задают опциональную информацию.


Пример позиционного атрибута:




Примеры предопределенного атрибута

DllImport – применяется к методу

Показывает, что метод реализован в неуправляемом коде, в указанной DLL-библиотеке. Задание этого атрибута приведет к тому, что во время выполнения программы библиотека будет загружена в память и указанный метод будет вызван из этой библиотеки.


Неуправляемые код – это, например, код, написанный на C и заключенный в динамически загружаемую библиотеку (DLL).





Conditional – применяется к методу

Помечает метод так, что он будет откомпилирован, только если в настройках проекта задан параметр этого атрибута.

Например,



Если проект сконфигурирован в режиме отладки (задан параметр DEBUGGING), то метод будет откомпилирован.


Параметр DEBUGGING можно задать так:





Пока параметр DEBUGGING задан, вызов метода будет произведен. Как только вы уберете #define DEBUGGING, строка с вызовом метода

MyClass.MyMethod();

просто будет пропущена. Фактически, атрибут принимается во внимание именно при вызове метода.


Кроме задания параметра с помощью #define, его можно задать в настройках проекта.


Атрибут Conditional может быть применен не к любым методам. Есть ряд ограничений. Методы должны быть void, не должны иметь модификатор override и не должны быть реализацией метода интерфейса.


Создание атрибута


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


Чтобы показать область действия атрибута при его задании, используется тег AttributeUsage:



В качестве target_elements могут выступать:

Class

Constructor

Delegate

Enum

Event

Field

Interface

Method

Module

Parameter

Property

ReturnValue

Struct

Assembly

All – любой элемент


Например, атрибут MyAttribute может быть применен только к методу:




Несколько атрибутов:




Если попытаться применить атрибут не к методу или конструктору, то возникнет ошибка компиляции.


После того, как задана область действия атрибута, нужно создать его класс:

Класс атрибута задает его
  • имя,
  • то, как он будет создан,
  • информацию, которую он будет хранить.



Ваши классы атрибутов должны быть унаследованы от системного класса System.Attribute




Существует правило, что к имени класса атрибута добавляют в конец слово Attribute, чтобы отличать классы атрибутов от остальных классов.


Составляющие класса атрибута




Конструктор

Позиционные параметры атрибута попадают в параметры конструктора. Обычно конструктор атрибута единственный. Если используются именованные параметры, то предпринимается попытка перегрузить конструктор. Но это не рекомендуемый способ. Лучше использовать свойства.


Для доступа к данным атрибута используются свойства. Кроме того, именованные параметры атрибута передаются в соответствующие свойства:




Компилятор обрабатывает атрибуты в следующей последовательности:

1. Ищет класс атрибута

2. Проверяет область действия атрибута

3. Проверяет конструктор атрибута

4. Создает экземпляр атрибута

5. Проверяет именованные параметры

6. Устанавливает именованные параметры в соответствии с имеющимися свойствами.

7. Сохраняет текущее состояние объекта атрибута.


На самом деле, компилятор только проверяет возможность выполнения этих шагов и сохраняет информацию об этом в метаданных. Во время компиляции создание объектов атрибутов не производится.


Пример




Указывать суффикс Attribute не обязательно, но если его не указать, то могут возникнуть неоднозначности при поиске класса атрибута. Поэтому нужно всегда указывать этот суффикс.


Элемент может иметь несколько атрибутов.




Элемент может иметь несколько экземпляров одного и того же атрибута. При этом нужно указывать параметр AllowMultiple=true атрибута AttributeUsage. Например, если мы создали атрибут DeveloperInfo, который содержит имя автора класса и авторов у класса несколько, то понадобятся несколько экземпляров атрибутов.