Роль атрибутов .NET
Как показывалось в начале настоящей главы, одной из задач компилятора .NET является генерирование описаний метаданных для всех типов, которые были определены, и на которые имеется ссылка в текущем проекте. Помимо стандартных метаданных, которые помещаются в любую сборку, программисты в .NET могут включать в состав сборки дополнительные метаданные с использованием атрибутов. В сущности, атрибуты представляют собой не более чем просто аннотации, которые могут добавляться в код и применяться к какому-то конкретному типу (классу, интерфейсу, структуре и т.д.), члену (свойству, методу и т.д.), сборке или модулю. Концепция аннотирования кода с применением атрибутов является далеко не новой. Еще в COM IDL (Interface Definition Language — язык описания интерфейсов) поставлялось множество предопределенных атрибутов, которые позволяли разработчикам описывать типы, содержащиеся внутри того или иного СОМ-сервера. Однако в СОМ атрибуты представляли собой немногим более чем просто набор ключевых слов. Когда требовалось создать специальный атрибут, разработчик в СОМ мог делать это, но затем он должен был ссылаться на этот атрибут в коде с помощью 128-битного числа (GUID- идентификатора), что, как минимум, довольно затрудняло дело. В .NET атрибуты представляют собой типы классов, которые расширяют абстрактный базовый класс System. Attribute. В поставляемых в .NET пространствах имен доступно множество предопределенных атрибутов, которые полезно применять в своих приложениях. Более того, можно также создавать собственные атрибуты и тем самым дополнительно уточнять поведение своих типов, создавая для атрибута новый тип, унаследованный от Attribute. Перечислим некоторые из предопределенных атрибутов, предлагаемые в различных пространствах имен .NET.
[CLSCompliant ] Заставляет элемент, к которому применяется, отвечать требованиям
CLS (Common Language Specification — общеязыковая спецификация).
[Dlllmport] Позволяет коду .NET отправлять вызовы в любую неуправляемую
библиотеку кода на С или C
[Obsolete ] Позволяет указать, что данный тип или член является устаревшим.
[Serializable] Позволяет указать, что класс или структура является "сериализируемой",
т.е. способна сохранять свое текущее состояние в потоке
[NonSerialized] Позволяет указать, что данное поле в классе или структуре не должно
сохраняться в процессе сериализации
[WebMethod] Позволяет указать, что метод может вызываться посредством HTTP- запросов, и CLR-среда должна преобразовывать его возвращаемое значение в формат XML
при применении атрибутов в коде размещающиеся внутри них метаданные, по сути, остаются бесполезными до тех пор, пока не запрашиваются явным образом в каком-то другом компоненте программного обеспечения посредством рефлексии. Если этого не происходит, они спокойно игнорируются и не причиняют никакого вреда.