День пятьдесят четвёртый. #ЗаметкиНаПолях

Атрибуты. Начало

Атрибуты предоставляют мощный способ связывания метаданных с кодом.

Свойства атрибутов:

- Добавление метаданных в вашу программу, то есть информации о типах, определённых в программе. Все сборки .NET содержат набор метаданных, описывающих типы и члены типов, определённые в сборке. Можно добавлять свои атрибуты, создавая классы-наследники System.Attribute.

- Вы можете применить один или несколько атрибутов ко всей сборке, модулю или более мелким элементам программы, таким как классы и свойства.

- Атрибуты могут принимать аргументы так же, как методы и свойства.

- Ваша программа может получать доступ к своим метаданным или к метаданным других программ, используя рефлексию.



Использование атрибутов

Атрибуты могут применяться к практически любому объявлению: сборкам, модулям, типам, полям, возвращаемым значениям, методам, параметрам, свойствам, событиям, а также к полям и методам, создаваемым компилятором. Атрибуты указываются в квадратных скобках ([]) над объявлением сущности, к которой они применяются.

В этом примере атрибут SerializableAttribute используется для объявления характеристики класса:

[Serializable]

public class SampleClass

{

// Объекты этого типа могут быть сериализованы.

}

По соглашению все имена атрибутов заканчиваются словом "Attribute", чтобы отделять их от других элементов библиотек .NET. Но его можно опускать при использовании атрибутов в коде. Например, [DllImport] эквивалентно [DllImportAttribute], но настоящее имя класса атрибута в библиотеке классов .NET Framework - DllImportAttribute.

Параметры атрибутов

Многие атрибуты имеют параметры, которые могут быть позиционными (неименованными) или именованными. Позиционные параметры обязаны указываться в определённом порядке и не могут быть опущены. Именованные параметры не обязательны и могут указываться в любом порядке. Позиционные параметры указываются первыми. Следующие три атрибута эквивалентны:

[DllImport("user32.dll")]

[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]

[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]

Первый параметр (имя DLL) позиционный и всегда идёт первым. Другие параметры именованные, оба по умолчанию имеют значение false, поэтому могут быть опущены. Позиционные параметры – это параметры конструктора атрибута, именованные соответствуют свойствам или полям атрибута.



Целевые объекты атрибутов

Целевой объект атрибута – это сущность, к которой применяется атрибут. По умолчанию атрибут применяется к элементу, которому он предшествует. Но вы можете явно определить, например, относится ли атрибут к методу, его параметру, либо к возвращаемому значению.

В следующем примере атрибуты применяются к сборке и модулю:

using System;

using System.Reflection;

[assembly: AssemblyTitleAttribute("Production assembly 4")]

[module: CLSCompliant(true)]

А в этом примере атрибуты применяются к методу и к возвращаемому значению метода:

// по умолчанию: применяется к методу

[ValidatedContract]

int Method1() { return 0; }



// применяется к методу

[method: ValidatedContract]

int Method2() { return 0; }



// применяется к возвращаемому значению

[return: ValidatedContract]

int Method3() { return 0; }

Замечание. Некоторые целевые объекты обязательны для указания в атрибуте для разрешения конфликтов между неоднозначными целевыми объектами атрибута:

- assembly – сборка,

- module – модуль,

- return – возвращаемое значение,

- field (для полей, созданных компилятором),

- method (для методов, созданных компилятором).