Когда создаются объекты атрибута?
Поскольку атрибуты - это действительно только метаданные, связанные с сборками, означает ли это, что объекты атрибута создаются только по запросу (например, когда вы вызываете GetCustomAttributes)?
Или они созданы при создании объекта?
Или комбинация первых 2, созданных при создании объекта из-за проверки атрибута с помощью CLR?
Ответы
Ответ 1
Из CLR через С#, третье издание:
Если вы хотите построить объект атрибута, вы должны вызвать либо GetCustomAttributes
, либо GetCustomAttribute
. Каждый раз, когда вызывается один из этих методов, он создает новые экземпляры указанного типа атрибута и устанавливает каждый из полей и свойств экземпляров на основе значений, указанных в исходном коде. Эти методы возвращают ссылки на полностью построенные экземпляры применяемых классов атрибутов.
Так что да, они создаются только по запросу.
Ответ 2
Они создаются по запросу.
Например, если вы добавите некоторые атрибуты .NET 3.0 в сборку .NET 2.0 (например, WCF DataContractAttribute
), вы все равно сможете использовать сборку .NET 2.0 на компьютере, который этого не имеет .NET 3.0, если у вас нет кода, который пытается получить доступ к атрибутам.
Ответ 3
Это не совсем так, что атрибуты также влияют на формирование кода. Некоторые атрибуты интерпретируются компилятором, например [DllImport]. Некоторые из них обнаруживаются джиттером, например [MethodImpl]. Это бесконечно распространяется на другие инструменты и классы в структуре, которые были написаны для использования атрибутов.
Но эти инструменты просто делают то, что вам нужно сделать, если вы хотите найти свои собственные атрибуты, требуя GetCustomAttributes(). Такой код никогда не ассоциируется с экземпляром объекта, а атрибуты применяются к типам.