2

我发现 C# 中的属性似乎是延迟实例化的。

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

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

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

4

3 回答 3

3

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

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

于 2010-09-02T05:39:51.003 回答
2

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

于 2010-09-02T05:40:43.633 回答
1

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

于 2010-09-02T06:30:23.077 回答