Накладные расходы на использование атрибутов в .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, вы заметите, что большинство его членов статические. Таким образом, они существуют только один раз, независимо от того, сколько у вас экземпляров атрибутов.

Это еще один момент подчеркнуть, что атрибуты не слишком дорогостоящие...