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

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

Я предполагаю, что мой вопрос, что такое атрибуты и как они полезны? Существует ли способ создать мои собственные атрибуты и как я могу сказать, имеют ли fields/methods/classes/whatever конкретные атрибуты или какие значения установлены в тех атрибутах?

16
задан Corey Ogburn 7 July 2010 в 17:24
поделиться

4 ответа

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

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

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

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

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

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

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

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

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

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

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

20
ответ дан 30 November 2019 в 17:14
поделиться

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

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

7
ответ дан 30 November 2019 в 17:14
поделиться

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

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

0
ответ дан 30 November 2019 в 17:14
поделиться

Думаю, ответ на следующий вопрос поможет вам лучше понять ваши вопросы.

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

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

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

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

6
ответ дан 30 November 2019 в 17:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: