Ответ 1
От Pro С# 2008 и платформа .NET 3.5, четвертое издание от Andrew Troelsen
Понимание атрибутивного программирования
Одна из составляющих компилятора .NET - генерировать метаданные описания для всех определенных и ссылочных типов. В дополнение к этим стандартным метаданным в любой сборке платформа .NET предоставляет возможность программистам встраивать дополнительные метаданные в сборку с использованием атрибутов. Вкратце, атрибуты - это не что иное, как код аннотации, которые могут быть применены к данному типу (класс, интерфейс, структура и т.д.), член (свойство, метод и т.д.), сборку или модуль. Идея аннотирования кода с использованием атрибутов не нова. COM IDL предоставил множество предопределенных атрибуты, позволяющие разработчикам описывать типы, содержащиеся в данном COM-сервере. Однако атрибуты COM были немного больше, чем набор ключевых слов. Если разработчику COM необходимо было создать пользовательский атрибут, он или она может это сделать, но на это ссылался код в 128-битном номере (GUID), который был в лучшем случае громоздким. В отличие от атрибутов COM IDL (которые снова были просто ключевыми словами), атрибуты .NET являются типами классов которые расширяют абстрактный базовый класс System.Attribute. Когда вы исследуете пространства имен .NET, вы будете найти множество предопределенных атрибутов, которые вы можете использовать в своих приложениях. Более того, вы можете создавать пользовательские атрибуты для дальнейшего определения поведения ваших типов, создавая новый тип, полученный из атрибута. Понимать, что при применении атрибутов в коде встроенные метаданные бесполезно, пока другая часть программного обеспечения явно не отразится на информации. Если это не так, фрагмент метаданных, встроенных в сборку, игнорируется и полностью безвреден.
Потребители атрибутов
Как вы могли догадаться, SDK.NET 3.5 Framework поставляется с многочисленными утилитами, которые действительно включены поиск различных атрибутов. Сам компилятор С# (csc.exe) был предварительно запрограммирован на выявить наличие различных атрибутов во время цикла компиляции. Например, если С# компилятор встречает атрибут [CLSCompliant], он автоматически проверяет атрибут убедитесь, что он раскрывает только конструкции, совместимые с CLS. В качестве другого примера, если компилятор С# обнаруживает элемент, присваиваемый атрибутом [Устаревший], он отображает предупреждение компилятора в Окно списка ошибок Visual Studio 2008. В дополнение к инструментам разработки многочисленные методы в библиотеках базового класса .NET предварительно запрограммированы для отражения конкретных атрибутов. Например, если вы хотите сохранить состояние object to file, все, что вам нужно сделать, это аннотировать ваш класс атрибутом [Serializable]. Если метод Serialize() класса BinaryFormatter встречает этот атрибут, объект автоматически сохранялся в файле в компактном двоичном формате. .NET CLR также находится в поиске новых атрибутов. Возможно, наиболее известный атрибут .NET - это [WebMethod]. Если вы хотите разоблачить метод через HTTP-запросы и автоматически закодируйте возвращаемое значение метода как XML, просто примените [WebMethod] к методу и CLR обрабатывает детали. Помимо разработки веб-сервисов, атрибуты имеют решающее значение для система безопасности .NET, Windows Communication Foundation и совместимость с COM/.NET(и так далее). Наконец, вы можете создавать приложения, которые запрограммированы, чтобы отражать ваши собственные атрибуты, а также любой атрибут в библиотеках базового класса .NET. Поступая таким образом, вы по существу способный создавать набор "ключевых слов", которые понимаются конкретным набором сборок.
Применение атрибутов в С#
Библиотека базового класса .NET предоставляет ряд атрибутов в различных Пространства имен. Ниже приведен снимок некоторых, но абсолютно не значит, что все предопределены атрибуты.
Небольшая выборка предопределенных атрибутов
[CLSCompliant]Заставляет аннотированный элемент соответствовать правилам Common Спецификация языка (CLS). Напомним, что CLS-совместимые типы гарантированно будет использоваться на всех языках программирования .NET.
[DllImport]Позволяет .NET-коду совершать вызовы на любой неуправляемый код на C- или С++ библиотеки, включая API базовой операционной системы. Обратите внимание, что [DllImport] не используется при общении с программным обеспечением на базе COM.
[Устаревшее]Отмечает устаревший тип или член. Если другие программисты пытаются использовать такой элемент, они получат предупреждение компилятора, описывающее ошибку их пути.
[Сериализуемый]Отмечает класс или структуру как "сериализуемую", то есть она может сохраняться его текущее состояние в поток.
[NonSerialized]Указывает, что данное поле в классе или структуре не должно сохраняться во время процесса сериализации.
[WebMethod]Отмечает метод как invokable через 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 (Description). Помимо того факта, что этот класс получен из System.Attribute, нет ничего уникального для этого класса определение.
По соображениям безопасности считается наилучшей практикой .NET для проектирования всех настраиваемых атрибутов как запечатанных. В факту, Visual Studio 2008 предоставляет фрагмент кода с именем Attribute, который выведет новую систему. Атрибут-производный класс в ваше окно кода.