Используется ли атрибут .Net во время компиляции, во время выполнения или в обоих случаях? - PullRequest
11 голосов
/ 22 февраля 2010

В .Net функция атрибутов используется во время компиляции или во время выполнения, или в обоих случаях? Можете привести несколько примеров?

Ответы [ 4 ]

14 голосов
/ 22 февраля 2010

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

  • [Conditional(...)] - опускать вызовы методов на символы сборки
  • [Obsolete(...)] - выдать предупреждение / ошибку в качестве результата сборки
  • [Serializable] - записывается как флаг CLI
  • [Extension] - используется для методов расширения
  • [AttributeUsage] - влияет на применение атрибутов

Существует ряд таких вещей, как [AssemblyVersion], [AssemblyFileVersion] и т. Д., Которые используются компилятором при создании файла сборки, и такие вещи, как [InternalsVisibleTo], которые влияют на доступность.

Кроме того, такие инструменты, как PostSharp, выполняют дополнительные шаги после компиляции на основе атрибутов.

Есть некоторые другие атрибуты, которые компилятор может добавить к сгенерированным типам / методам (для anon-методов / типов, блоков итераторов и т. Д.).

8 голосов
/ 22 февраля 2010

Атрибуты выводятся в виде метаданных в сборку во время компиляции. Эти метаданные затем используются во время выполнения посредством отражения - например, с использованием GetCustomAttributes().

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

1 голос
/ 22 февраля 2010

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

0 голосов
/ 22 февраля 2010

Компилятор добавляет так называемые метаданные к объекту, который украшен атрибутом. Эти метаданные, созданные с помощью атрибутов или иным образом, доступны во время выполнения до Отражение . Таким образом, вы можете украсить атрибутами, а затем прочитать подробности во время работы программы. Однако сказать, что метаданные «используются» во время компиляции, не совсем правильно, так как компилятору все равно, какие метаданные есть.

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