Как правильно писать тесты 46 Цикл разработки 46 Структура проекта с тестами 51 Утверждения (Asserts) 52 Утверждения в форме ограничений 54 Категории 56
Вид материала | Тесты |
СодержаниеПример позиционного атрибута Создание атрибута Составляющие класса атрибута |
- Некорректные задания, 1276.79kb.
- К техническому регламенту, 835.7kb.
- Правительства Российской Федерации от 11 ноября 2005 г. N 679 о порядке разработки, 494.44kb.
- Постановлением Правительства Российской Федерации от 11 ноября 2005 г. N 679 о порядке, 652.85kb.
- Постановлением Правительства Российской Федерации от 11 ноября 2005 г. N 679 о порядке, 623.18kb.
- Правительства Российской Федерации от 11. 11. 2005 N 679 о порядке разработки и утверждения, 533.6kb.
- Постановления Правительства Российской Федерации от 11. 11. 2005 n 679 о порядке разработки, 613.63kb.
- Об утверждении требований к схемам теплоснабжения, порядку их разработки и утверждения, 450.79kb.
- Рабочая программа учебной дисциплины. Общие требования, порядок разработки, согласования, 414.77kb.
- Постановлением Правительства Российской Федерации от 11 ноября 2005 г. N 679 о порядке, 1924.26kb.
Атрибуты22
Атрибуты – это способ добавления к классам метаданных. Атрибут можно представить как тег, в котором закладывается дополнительная информация о классах, перечислениях и других элементах C#. Эту информацию можно извлекать в процессе работы программы.
Атрибуты могут служить способом документирования кода. Информация, заложенная в атрибутах, хранится в метаданных элементов, с которыми атрибуты ассоциированы.
В .NET Framework существует ряд предопределенных атрибутов.
Синтаксис
Атрибут задается в квадратных скобках [ ]:
![](images/289842-nomer-7799e287.gif)
Если нужно задать несколько атрибутов:
можно использовать несколько пар квадратных скобок,
можно перечислить атрибуты через запятую в одних квадратных скобках,
Иногда нужно явно указывать имя элемента, с которым ассоциирован атрибут.
Параметры атрибута делятся на позиционные и именованные.
Позиционные параметры похожи на параметры методов. Они должны идти перед именованными параметрами и служат для передачи существенной информации. Именованные параметры задают опциональную информацию.
Пример позиционного атрибута:
![](images/289842-nomer-2d083964.gif)
Примеры предопределенного атрибута
DllImport – применяется к методу
Показывает, что метод реализован в неуправляемом коде, в указанной DLL-библиотеке. Задание этого атрибута приведет к тому, что во время выполнения программы библиотека будет загружена в память и указанный метод будет вызван из этой библиотеки.
Неуправляемые код – это, например, код, написанный на C и заключенный в динамически загружаемую библиотеку (DLL).
![](images/289842-nomer-m174af7c3.gif)
Conditional – применяется к методу
Помечает метод так, что он будет откомпилирован, только если в настройках проекта задан параметр этого атрибута.
Например,
![](images/289842-nomer-m678156f6.gif)
Если проект сконфигурирован в режиме отладки (задан параметр DEBUGGING), то метод будет откомпилирован.
Параметр DEBUGGING можно задать так:
![](images/289842-nomer-m69d28776.gif)
Пока параметр DEBUGGING задан, вызов метода будет произведен. Как только вы уберете #define DEBUGGING, строка с вызовом метода
MyClass.MyMethod();
просто будет пропущена. Фактически, атрибут принимается во внимание именно при вызове метода.
Кроме задания параметра с помощью #define, его можно задать в настройках проекта.
Атрибут Conditional может быть применен не к любым методам. Есть ряд ограничений. Методы должны быть void, не должны иметь модификатор override и не должны быть реализацией метода интерфейса.
Создание атрибута
Атрибут – это объект, ассоциированный с одним или несколькими элементами программы. Объект хранится в метаданных элемента и предоставляет информацию по запросу.
Чтобы показать область действия атрибута при его задании, используется тег AttributeUsage:
![](images/289842-nomer-7312b8c7.gif)
В качестве target_elements могут выступать:
Class
Constructor
Delegate
Enum
Event
Field
Interface
Method
Module
Parameter
Property
ReturnValue
Struct
Assembly
All – любой элемент
Например, атрибут MyAttribute может быть применен только к методу:
![](images/289842-nomer-m659d3c49.gif)
Несколько атрибутов:
![](images/289842-nomer-1f3604f8.gif)
Если попытаться применить атрибут не к методу или конструктору, то возникнет ошибка компиляции.
После того, как задана область действия атрибута, нужно создать его класс:
Класс атрибута задает его
- имя,
- то, как он будет создан,
- информацию, которую он будет хранить.
Ваши классы атрибутов должны быть унаследованы от системного класса System.Attribute
![](images/289842-nomer-m273df8cf.gif)
Существует правило, что к имени класса атрибута добавляют в конец слово Attribute, чтобы отличать классы атрибутов от остальных классов.
Составляющие класса атрибута
Конструктор
Позиционные параметры атрибута попадают в параметры конструктора. Обычно конструктор атрибута единственный. Если используются именованные параметры, то предпринимается попытка перегрузить конструктор. Но это не рекомендуемый способ. Лучше использовать свойства.
Для доступа к данным атрибута используются свойства. Кроме того, именованные параметры атрибута передаются в соответствующие свойства:
![](images/289842-nomer-6294210c.gif)
Компилятор обрабатывает атрибуты в следующей последовательности:
1. Ищет класс атрибута
2. Проверяет область действия атрибута
3. Проверяет конструктор атрибута
4. Создает экземпляр атрибута
5. Проверяет именованные параметры
6. Устанавливает именованные параметры в соответствии с имеющимися свойствами.
7. Сохраняет текущее состояние объекта атрибута.
На самом деле, компилятор только проверяет возможность выполнения этих шагов и сохраняет информацию об этом в метаданных. Во время компиляции создание объектов атрибутов не производится.
Пример
![](images/289842-nomer-31069a3e.gif)
Указывать суффикс Attribute не обязательно, но если его не указать, то могут возникнуть неоднозначности при поиске класса атрибута. Поэтому нужно всегда указывать этот суффикс.
Элемент может иметь несколько атрибутов.
![](images/289842-nomer-33c72061.gif)
Элемент может иметь несколько экземпляров одного и того же атрибута. При этом нужно указывать параметр AllowMultiple=true атрибута AttributeUsage. Например, если мы создали атрибут DeveloperInfo, который содержит имя автора класса и авторов у класса несколько, то понадобятся несколько экземпляров атрибутов.
![](images/289842-nomer-625c561.gif)