Из Pro C # 2008 и платформы .NET 3.5, четвертое издание Эндрю Троелсена
Понимание атрибутного программирования
Одной из функций компилятора .NET является генерация метаданных.
описания для всех определенных и ссылочных типов. В дополнение к этим стандартным метаданным содержится
В любой сборке платформа .NET позволяет программистам вставлять дополнительные
метаданные в сборку с использованием атрибутов. В двух словах, атрибуты - это не более чем код
аннотации, которые могут быть применены к данному типу (класс, интерфейс, структура и т. д.), член (свойство,
метод и т. д.), сборка или модуль.
Идея аннотирования кода с использованием атрибутов не нова. COM IDL предоставил множество предопределенных
атрибуты, которые позволяли разработчикам описывать типы, содержащиеся в данном COM-сервере.
Тем не менее, атрибуты COM были немного больше, чем набор ключевых слов. Если разработчик COM необходимо
создать пользовательский атрибут, он или она могли бы сделать это, но на него в коде ссылается 128-битное число
(GUID), который был в лучшем случае громоздким.
В отличие от атрибутов COM IDL (которые опять-таки были просто ключевыми словами), атрибуты .NET являются типами классов
которые расширяют абстрактный базовый класс System.Attribute. По мере изучения пространств имен .NET вы будете
найдите много предопределенных атрибутов, которые вы можете использовать в своих приложениях. Более того,
вы можете создавать собственные атрибуты для дальнейшей оценки поведения ваших типов путем создания
новый тип, производный от атрибута.
Следует понимать, что когда вы применяете атрибуты в своем коде, встроенные метаданные по существу
бесполезен, пока другая часть программного обеспечения явно не отражает информацию. Если это не так,
всплеск метаданных, встроенных в сборку, полностью игнорируется.
Атрибут Потребители
Как вы могли догадаться, .NET 3.5 Framework SDK поставляется с множеством утилит, которые действительно включены
поиск различных атрибутов. Сам компилятор C # (csc.exe) был предварительно запрограммирован на
обнаружить наличие различных атрибутов во время цикла компиляции. Например, если C #
Компилятор встречает атрибут [CLSCompliant], он автоматически проверит приписанный элемент
убедитесь, что он предоставляет только CLS-совместимые конструкции. В качестве другого примера, если компилятор C #
обнаруживает элемент, связанный с атрибутом [устаревший], он отображает предупреждение компилятора в
Окно списка ошибок Visual Studio 2008
В дополнение к инструментам разработки, предварительно запрограммированы многочисленные методы в библиотеках базовых классов .NET
размышлять над конкретными атрибутами. Например, если вы хотите сохранить состояние
объект в файл, все, что вам нужно сделать, это аннотировать ваш класс с помощью атрибута [Serializable]. Если
метод Serialize () класса BinaryFormatter встречает этот атрибут, объект автоматически
сохраняется в файл в компактном двоичном формате.
.NET CLR также находится в поиске наличия определенных атрибутов. Пожалуй самый
известным атрибутом .NET является [WebMethod]. Если вы хотите выставить метод через HTTP-запросы и автоматически
закодируйте возвращаемое значение метода как XML, просто примените [WebMethod] к методу и
CLR обрабатывает детали. Помимо разработки веб-сервисов, атрибуты имеют решающее значение для работы
система безопасности .NET, Windows Communication Foundation и совместимость COM / .NET
(и так далее).
Наконец, вы можете создавать приложения, которые запрограммированы на отражение ваших собственных пользовательских
атрибуты, а также любой атрибут в библиотеках базовых классов .NET. Тем самым вы по сути
возможность создавать набор «ключевых слов», понятных определенному набору сборок.
Применение атрибутов в C #
Библиотека базовых классов .NET предоставляет ряд атрибутов в различных
Пространства имен. Ниже приведен снимок некоторых, но отнюдь не всех, предопределенных
атрибутов.
Крошечная выборка предопределенных атрибутов
[CLSCompliant]
Enпринуждает аннотированный элемент соответствовать правилам Общего
Спецификация языка (CLS). Напомним, что CLS-совместимые типы
гарантированно будет использоваться на всех языках программирования .NET.
[DllImport]
Позволяет коду .NET выполнять вызовы к любому неуправляемому коду на C или C ++
библиотека, в том числе API базовой операционной системы. Обратите внимание, что
[DllImport] не используется при обмене данными с программным обеспечением на основе COM.
[Устаревшее]
Отмечает устаревший тип или член. Если другие программисты пытаются использовать
такой элемент, они получат предупреждение компилятора, описывающее ошибку
их пути.
[Сериализуемый]
Помечает класс или структуру как «сериализуемые», что означает, что они могут сохраняться
его текущее состояние в поток.
[NonSerialized]
Указывает, что данное поле в классе или структуре не должно сохраняться
в процессе сериализации.
[WebMethod]
Помечает метод как вызываемый через HTTP-запросы и инструктирует CLR
сериализировать возвращаемое значение метода как XML.
Создание пользовательских атрибутов
Первым шагом в создании пользовательского атрибута является создание нового класса, производного от System.Attribute. Пример:
// A custom attribute.
public sealed class VehicleDescriptionAttribute : System.Attribute
{
private string msgData;
public VehicleDescriptionAttribute(string description)
{
msgData = description;
}
public VehicleDescriptionAttribute() { }
public string Description
{
get { return msgData; }
set { msgData = value; }
}
}
Как видите, VehicleDescriptionAttribute поддерживает частную внутреннюю строку (msgData)
это можно установить с помощью пользовательского конструктора и манипулировать с помощью свойства type (описание).
Помимо того факта, что этот класс является производным от System.Attribute, в этом классе нет ничего уникального
определение.
В целях безопасности считается, что в .NET рекомендуется разрабатывать все пользовательские атрибуты как закрытые. В
Фактически, Visual Studio 2008 предоставляет фрагмент кода с именем Attribute, который выводит новую систему.
Производный от атрибута класс в вашем окне кода.