为什么属性被懒惰地实例化?

时间:2010-09-02 05:31:04

标签: c# .net attributes lazy-initialization

我发现C#中的属性似乎被懒惰地实例化了。

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

在此示例中,创建新的A实例会导致StackOverflowException,但如果我删除对GetCustomAttributes()的调用,则执行正常进行。

这是为什么?对我来说更有意义的是,当他们装饰的类是属性时,属性被正确初始化。

3 个答案:

答案 0 :(得分:3)

为什么运行时需要在请求之前在类上实例化所有属性?这就像问为什么运行时不提前创建我的类的实例,以防我以后想要使用它。

属性是类上的元数据,它们不会以任何方式影响类工作。只有请求属性关心它的代码,没有其他人没有。所以当前的行为确实有意义。

答案 1 :(得分:2)

由于属性功能仅由主动查找相关属性的代码执行,因此运行时在首次使用属性之前实例化属性是浪费的 - 实际上,在程序的生命周期中,属性可能从不进行检查。

答案 2 :(得分:1)

属性是与类型相关联的“信息”,而不是与实例相关联 当你创建一个附加类型的对象时,没有理由将它们实例化,而是在你检查类型本身时可以看到它们。