Атрибуты

В большинстве языков программирования одна часть информации выражается в объявлениях, а другая — в программном коде. Например, в следующем объявлении переменной класса компилятор и среда выполнения резервируют память для целочисленной переменной и устанавливают права доступа таким образом, чтобы эта переменная была общедоступной:

public int Test;

Приведенный пример относится к декларативной информации; ее основными достоинствами является лаконичность выражения и то, что вся обработка технических деталей выполняется компилятором.

Как правило, разновидности декларативной информации определяются разработчиком языка и не могут расширяться пользователями. Например, если пользователь захочет связать с переменной класса некоторое поле базы данных, он должен самостоятельно изобрести средства для выражения этой связи на уровне языка, сохранения этой связи и обращения к данным во время выполнения программы. В языках типа C++ можно определить макрос для сохранения информации в переменной, являющейся частью объекта. Такие схемы работают, но они не поддаются обобщению и часто приводят к возникновению ошибок. Кроме того, подобные решения попросту уродливы.

В среде .NET Runtime поддерживаются атрибуты (attributes), которые представляют собой «примечания» к элементам исходного текста программы (классам, членам классов, параметрам и т. д.). При помощи атрибутов можно изменить поведение программы во время выполнения, передать сведения об объекте для проведения транзакций или описать его организационную структуру. Информация атрибутов хранится вместе с метаданными элемента. Ее можно легко прочитать во время выполнения программы, этот процесс называется рефлексией (reflection).

В C# используются условные атрибуты, управляющие вызовом функций классов. Возможное применение условного атрибута может выглядеть так:

using System.Diagnostics;

class Test

{

[Conditional("DEBUG")]

public void Validate()

{

}

}

Большинство программистов предпочитает использовать стандартные атрибуты, а не определять собственные классы атрибутов.

Предлагаю ознакомиться с аналогичными статьями: