Почему атрибуты лениво создаются? - PullRequest
2 голосов
/ 02 сентября 2010

Я обнаружил, что атрибуты в C #, похоже, лениво создаются.

[A(123)]
class A : Attribute
{
    public A(int b)
    {
        GetType().GetCustomAttributes(true);
    }
}

В этом примере создание нового экземпляра A вызывает StackOverflowException, но если я удаляю вызов на GetCustomAttributes(), то выполнение продолжается нормально.

Почему это? Для меня имеет больше смысла, что атрибуты правильно инициализируются, когда класс, который они украшают, является.

Ответы [ 3 ]

3 голосов
/ 02 сентября 2010

Почему среда выполнения должна создавать экземпляры всех атрибутов класса, прежде чем вы их запросите?Это все равно, что спросить, почему среда выполнения не создает экземпляр моего класса заранее, на случай, если я захочу использовать его позже.

Атрибуты являются метаданными класса, они никак не влияют на работу класса.,Об этом заботится только код запросов атрибута, больше никого нет.Таким образом, текущее поведение имеет смысл.

2 голосов
/ 02 сентября 2010

Поскольку функциональность атрибутов всегда выполняется только кодом, который активно ищет рассматриваемый атрибут, для среды выполнения расточительно создавать экземпляры атрибутов до их первого использования - действительно, во время жизни программы атрибуты могут никогда не проверяйте 1003 *

1 голос
/ 02 сентября 2010

Атрибуты - это «информация», связанная с типом, а не с экземпляром.
Нет причин, по которым их следует создавать при создании объекта того типа, к которому они присоединены, вместо этого вы можете видеть их при проверке самого типа.

...