Является ли атрибут .Net атрибутом, используемым во время компиляции или во время выполнения, или и то, и другое?
В .Net - функция атрибута, используемая во время компиляции или времени выполнения или для обоих? Можете ли вы привести несколько примеров?
Ответы
Ответ 1
Атрибуты выводятся как метаданные для сборки во время компиляции. Эти метаданные затем используются во время выполнения через отражение - например, используя GetCustomAttributes()
.
Некоторые атрибуты также используются компилятором во время компиляции. Например, компилятор просматривает AttributeUsageAttribute
, чтобы определить, можно ли использовать атрибут для определенного объекта.
Ответ 2
Большинство из них используются только во время выполнения. Компилятор использует очень ограниченное число, в том числе:
-
[Conditional(...)]
- пропустить вызовы методов для символов сборки
-
[Obsolete(...)]
- испускать предупреждение/ошибку как вывод сборки
-
[Serializable]
- записывается как флаг CLI
-
[Extension]
- используется для методов расширения
-
[AttributeUsage]
- влияет на применение атрибутов
-
Существует ряд таких вещей, как [AssemblyVersion]
, [AssemblyFileVersion]
и т.д., которые используются компилятором при создании файла сборки, и такие вещи, как [InternalsVisibleTo]
, которые влияют на доступность.
Кроме того, такие инструменты, как PostSharp, выполняют дополнительные шаги после компиляции на основе атрибутов.
Есть и другие атрибуты, которые компилятор может добавить к сгенерированным типам/методам (для anon-методов/типов, блоков итератора и т.д.).
Ответ 3
Атрибуты скомпилированы в код во время компиляции, но они часто используются во время выполнения в качестве триггеров, чтобы делать что-то по-другому.
Ответ 4
Компилятор добавляет так называемые метаданные к объекту, украшенному атрибутом. Эти метаданные, созданные через атрибуты или иным образом, доступны во время выполнения через Reflection. Таким образом, вы можете украсить атрибутами, а затем прочитать детали при запуске программы. Однако сказать, что метаданные "используются" во время компиляции не совсем корректны, поскольку компилятору все равно, какие метаданные есть.