Является ли атрибут .Net атрибутом, используемым во время компиляции или во время выполнения, или и то, и другое?

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

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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