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