2012-02-06 3 views
12

Поскольку Атрибуты - это действительно только метаданные, присоединенные к сборкам, означает ли это, что Атрибутные объекты создаются только по запросу (например, когда вы вызываете GetCustomAttributes)?Когда создаются объекты атрибута?

Или они созданы при создании объекта?

Или комбинация первых 2, созданных при создании объекта из-за сканирования атрибутов с помощью CLR?

+0

Весьма связанный: [Атрибуты .NET: Почему GetCustomAttributes() каждый раз создает новый экземпляр атрибута?] (Http://stackoverflow.com/q/417275/319403). Можете даже ответить на ваш вопрос, учитывая. – cHao

+0

Это было сделано. Фактический вопрос для меня не был для меня проблемой, но в середине появился ответ. Хорошо также иметь Священные Писания из книги CLR (через @Smi). – Dann

ответ

8

С CLR через C#, третье издание:

Если вы хотите построить объект атрибута, вы должны вызвать либо GetCustomAttributes или GetCustomAttribute. Каждый раз, когда вызывается один из этих методов, он создает новые экземпляры указанного типа атрибута и устанавливает каждое из полей и свойств экземпляра на основе значений, указанных в исходном коде. Эти методы возвращают ссылки на полностью созданные экземпляры применяемых классов атрибутов.

Да, они созданы только по запросу.

4

Изготовлены по запросу.

Например, если вы добавили некоторые .NET 3.0-атрибуты в сборку .NET 2.0 (например, WCF DataContractAttribute), вы все равно сможете использовать сборку .NET 2.0 на компьютере, на котором нет .NET. 3.0, если у вас нет кода, который пытается получить доступ к атрибутам.

2

Это не совсем так, что атрибуты также влияют на формирование кода. Некоторые атрибуты интерпретируются компилятором, например [DllImport]. Некоторые из них обнаруживаются джиттером, например [MethodImpl]. Это бесконечно распространяется на другие инструменты и классы в рамках, которые были написаны для использования атрибутов.

Но эти инструменты просто делают то, что вам нужно сделать, если вы хотите найти свои собственные атрибуты, требуя GetCustomAttributes(). Такой код никогда не ассоциируется с экземпляром объекта, а атрибуты применимы к типам.

+0

Итак, будут ли те атрибуты, которые принадлежат системе («DllImport»), оставаться метаданными и анализироваться таким образом, а не объект, а затем использоваться? – Dann

+1

Какие инструменты на самом деле * делают * с атрибутом повсюду. –

Смежные вопросы