2010-09-02 1 views
2

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

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

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

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

+0

Что значит для инициализации класса? Когда вы думаете, что это происходит? – Gabe

ответ

3

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

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

2

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

1

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