Повышение производительности при использовании атрибутов в .NET - PullRequest
12 голосов
/ 10 ноября 2009

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 .. Будет ли этот сценарий отличаться для структур (структуры - это типы значений, а атрибуты - ссылочные типы)?

4 .. Где хранятся атрибуты в памяти относительно объекта, к которому они прикреплены? Как они связаны друг с другом?

5 .. Атрибуты инициализируются сразу после инициализации MyClass или когда вы используете отражение для их получения?

Ответы [ 2 ]

27 голосов
/ 10 ноября 2009
  1. С точки зрения пространства есть небольшие накладные расходы, но не слишком много - атрибуты не мешают нормальному выполнению.

  2. Нет, атрибуты действуют на типы, а не на экземпляры, поэтому вы не будете занимать огромный объем памяти, используя множество «больших» атрибутов. (Я не знаю, получаете ли вы один за конкретный тип для универсальных или один за определение универсального типа - я бы ожидал, что последний ...)

  3. Нет, из-за ответа на 1.

  4. Атрибуты не привязаны к объектам - они привязаны к типам. Я не знаю подробностей точно , где они хранятся в памяти, но в любом случае это деталь реализации.

  5. Атрибуты инициализируются только при использовании отражения.

4 голосов
/ 12 декабря 2012

Джон Скит абсолютно прав, и я хочу дать только одно дополнительное понятие:

Если вы посмотрите на базовый класс всех атрибутов System.Attribute, вы заметите, что большинство его членов static . Таким образом, они существуют только один раз, независимо от того, сколько у вас есть экземпляров атрибутов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...