Атрибуты C # и их использование - PullRequest
16 голосов
/ 07 июля 2010

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

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

Ответы [ 4 ]

20 голосов
/ 07 июля 2010

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

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

Выобычно хотят использовать атрибуты для описания фактов о механизме типа или метода, а не , означающем типа или метода. Например, предположим, что у вас есть тип Employee,Факт о , означающем «Сотрудник», заключается в том, что это своего рода Персона, у Сотрудника есть Менеджер и так далее.Факт о механизме Сотрудника заключается в том, что он может быть целью привязки данных, или его можно сериализовать на диск или что-то еще.Сотрудник не может быть сериализован на диск, но может быть class Employee.Атрибуты позволяют вам отделить информацию о технических деталях от семантической модели.

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

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

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

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

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

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

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

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

7 голосов
/ 07 июля 2010

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

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

6 голосов
/ 07 июля 2010

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

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

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

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

Атрибуты могут применяться практически ко всем аспектам вашего кода.Например, атрибуты могут быть связаны на уровне сборки, например атрибуты 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.Фактически, экземпляры атрибутов создаются только при первом запросе атрибутов.

0 голосов
/ 07 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...