Атрибут – средство добавления ДЕКЛАРАТИВНОЙ информации к элементам программного кода. Назначение атрибутов – внесение всевозможных не предусмотренных обычным ходом выполнения приложения изменений:
§ описание взаимодействия между модулями,
§ дополнительная информация, используемая при работе с данными (управление сериализацией),
§ отладка,
§ много чего другого.
Эта декларативная информация составляет часть метаданных кода. Она может быть использована при помощи механизмов отражения.
Структура атрибута регламентирована. Атрибут – это класс. Общий предок всех атрибутов – класс System.Attribute.
Информация, закодированная с использованием атрибутов, становится доступной в процессе ОТРАЖЕНИЯ (рефлексии типов).
Атрибуты типизированы.
.NET способна прочитать информацию в атрибутах и использовать её в соответствии с предопределёнными правилами или замыслами разработчика. Различаются
§ Предопределённые атрибуты. В .NET реализовано множество атрибутов с предопределёнными значениями:
DllImport – для загрузки .dll файлов.
Serializable – означает возможность сериализации свойств объекта-представителя класса.
NonSerialized – обозначает данные-члены класса как несериализуемые. Карандаши не сереализуются.
§ Производные (пользовательские) атрибуты могут определяться и использоваться в соответствии с замыслами разработчика. Возможно создание собственных (пользовательских) атрибутов. Главные условия:
соблюдение синтаксиса,
соблюдение принципа наследования.
В основе пользовательских атрибутов – всё та же система типов с наследованием от базового класса System.Attribute.
И не спроста! В конце-концов, информация, содержащаяся в атрибутах, предназначается для Framework.NET и она должна суметь в ней разбираться. Пользователи или другие инструментальные средства должны уметь кодировать и декодировать эту информацию.
Добавлять атрибуты можно к:
§ сборкам,
§ классам,
§ элементам класса,
§ структурам,
§ элементам структур,
§ параметрам,
§ возвращаемым значениям.
Следующий пример является демонстрацией объявление и применения производных атрибутов.