С# Атрибуты и их использование

Я действительно мало знаю об атрибутах вообще в С#, я видел их в использовании разными способами/местами, но я не думаю, что я вижу важность некоторых из них. Некоторые определенно имеют важное значение, поскольку они обеспечивают заметную функцию, например [Serializable]. Тем не менее, другие не кажутся такими важными, как, например, мой коллега использует для обозначения свойств с помощью [DataMember].

Я полагаю, что мой вопрос: какие атрибуты и как они полезны? Есть ли способ создать мои собственные атрибуты и как я могу определить, установлены ли в этих атрибутах поля/методы/классы/независимо от того, какие атрибуты или какие значения установлены?

Ответы

Ответ 1

какие атрибуты?

Атрибуты позволяют вставлять информацию о типе или методе в метаданные, описывающие этот тип или метод.

Обычно вы хотите использовать атрибуты для описания фактов о механизме типа или метода, а не в смысле типа или метода. Например, предположим, что у вас есть тип Employee. Факт о значении Employee заключается в том, что он является своего рода Лицом, что у Работника есть Менеджер и так далее. Факт о механизме Employee заключается в том, что он может быть объектом привязки данных или может быть сериализован на диск или что угодно. Сотрудник не может быть сериализован на диск, но класс Employee может быть. Атрибуты позволяют отделять информацию о технических деталях от семантической модели.

Есть ли способ создать мои собственные атрибуты?

Да. Создайте класс, который расширяет атрибут. По соглашению вы хотите назвать его "FooAttribute". Если вы это сделаете, вы можете использовать синтаксис [Foo] или синтаксис [FooAttribute] по своему усмотрению.

Как я могу определить, установлены ли в этих атрибутах поля/методы/классы/независимо от определенных атрибутов или какие значения?

Используйте метод GetCustomAttributes для объектов отражения.

Где я должен прочитать дополнительную информацию?

Начните с руководства по атрибутам:

http://msdn.microsoft.com/en-us/library/aa288454(VS.71).aspx

И затем прочитайте всю главу 17 спецификации С#.

Ответ 2

Атрибуты - это средство, с помощью которого вы можете связывать метаданные с типами в .NET. Это позволяет вам проверить тип и получить информацию об этом, которая отделена от информации о времени выполнения.

Это может быть очень полезно. Вы упомянули [Serializable], но другие простые примеры включают в себя многие типы System.ComponentModel, такие как Description, который используется свойством сетью, чтобы "описать" свойства, когда вы работаете с ними в дизайнере. Поскольку "описание" свойства действительно не связано с поведением типа в программе (во время выполнения), оно не относится к классу. Тем не менее, это очень удобно, когда вы идете редактировать элемент управления в визуальном дизайнере, например, чтобы увидеть описание (или категорию и т.д.) Свойства. Атрибуты - это средства, с помощью которых это обрабатывается.

Ответ 3

Я думаю, что ответ на следующий вопрос предоставит вам некоторое понимание ваших вопросов.

Как работают классы атрибутов?

Вот ответ ответа, который я предоставил.

Атрибуты - это, по существу, метаданные, которые могут быть прикреплены к различным частям вашего кода. Эти метаданные могут затем быть взаимозависимыми и влиять на поведение определенных операций.

Атрибуты могут применяться практически ко всем аспектам вашего кода. Например, атрибуты могут быть связаны на уровне Ассамблеи, такие как атрибуты AssemblyVersion и AssemblyFileVersion, которые определяют номера версий, связанные с сборкой.

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Затем атрибут Serializable, например, может быть применен к объявлению типа для обозначения типа поддержки сериализации. Фактически этот атрибут имеет особое значение в CLR и фактически хранится как специальная директива непосредственно по типу в IL, он оптимизирован для хранения в виде битового флага, который может обрабатываться намного эффективнее, есть несколько атрибутов на этот характер, который известен как псевдостандартные атрибуты.

Другие атрибуты могут применяться к методам, свойствам, полям, перечислениям, возвращаемым значениям и т.д. Вы можете получить представление о возможных целях, к которым может применяться атрибут, если посмотреть на эту ссылку http://msdn.microsoft.com/en-us/library/system.attributetargets(VS.90).aspx

Кроме того, вы можете определить свои собственные пользовательские атрибуты, которые затем могут применяться к целевым объектам, для которых предназначены ваши атрибуты. Затем во время выполнения ваш код может отражать значения, содержащиеся в пользовательских атрибутах, и принимать соответствующие меры.

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

TableMappingAttribute
ColumnMappingAttribute

Что вы можете применить к своим классам, в качестве примера у нас есть класс Person

[TableMapping("People")]
public class Person
{
  [ColumnMapping("fname")]
  public string FirstName {get; set;}

  [ColumnMapping("lname")]
  public string LastName {get; set;}
}

Когда это компилируется, за исключением того факта, что компилятор испускает дополнительные метаданные, определенные пользовательскими атрибутами, на что-то другое влияет. Однако теперь вы можете написать PersistanceManager, который может динамически проверять атрибуты экземпляра класса Person и вставлять данные в таблицу People, сопоставляя данные в свойстве FirstName с столбцом fname и свойством LastName в столбце lname.

Что касается вашего вопроса относительно экземпляров атрибутов, экземпляр атрибута не создается для каждого экземпляра вашего класса. Все экземпляры People будут совместно использовать один и тот же экземпляр атрибутов TableMappingAttribute и ColumnMappingAttributes. Фактически экземпляры атрибутов создаются только тогда, когда вы действительно запрашиваете атрибуты в первый раз.

Ответ 4

С# предоставляет механизм для определения декларативных тегов, называемых атрибутами, которые вы можете поместить на определенные объекты в исходном коде, чтобы указать дополнительную информацию. Информация, которую содержат атрибуты, может быть получена во время выполнения через отражение. Вы можете использовать предопределенные атрибуты или вы можете определить свои собственные пользовательские атрибуты.

http://msdn.microsoft.com/en-us/library/aa288059%28v=VS.71%29.aspx