Накладные расходы на использование атрибутов в .NET.
1.. Есть ли накладные расходы на производительность, вызванные использованием атрибутов? Подумайте о таком классе, как:
public class MyClass
{
int Count {get;set;}
}
где он имеет 10 атрибутов (атрибуты являются классами, где сами классы атрибутов больше, чем MyClass, например:
public class FirstAttribute : Attribute
{
int A,B,C,D,E,F,G,H,I,J ... {get;set;}
}
2.. Будет ли 10 из этих атрибутов накладными расходами памяти каждый раз при создании MyClass
? (FirstAttribute
, в 10 раз превышающем размер MyClass
, который будет украшен 10 из них, поэтому сделать сам фактический объект настолько мал по сравнению с общим размером атрибутов, украшенных на нем.) Является ли это проблемой?
3.. Будет ли этот сценарий каким-либо другим для структур (Structs - типы значений и атрибуты, являющиеся ссылочными типами)?
4.. Где аттрибуты хранятся в памяти относительно объекта, к которому они прикреплены? Как они связаны друг с другом?
5.. Инициализируются ли атрибуты, как только MyClass
инициализируется, или когда вы используете отражение для их извлечения?
Ответы
Ответ 1
-
Там крошечные накладные расходы с точки зрения пространства, но не много - атрибуты не мешают нормальному выполнению.
-
Нет, атрибуты действуют на типы, а не экземпляры, поэтому вы не будете использовать большой объем памяти, используя множество "больших" атрибутов. (Я не знаю, получите ли вы один конкретный тип для дженериков, или один для определения общего типа - я бы ожидал последнего...)
-
Нет, из-за ответа на 1.
-
Атрибуты не привязаны к объектам - они привязаны к типам. Я не знаю подробностей о том, где они хранятся в памяти, но в любом случае это детали реализации.
-
Атрибуты инициализируются только при использовании отражения.
Ответ 2
Джон Скит абсолютно прав, и я хочу только дать одно дополнительное понятие:
Если вы посмотрите на базовый класс всех атрибутов, System.Attribute, вы заметите, что большинство его членов статические. Таким образом, они существуют только один раз, независимо от того, сколько у вас экземпляров атрибутов.
Это еще один момент подчеркнуть, что атрибуты не слишком дорогостоящие...