我发现C#中的属性似乎被懒惰地实例化了。
[A(123)]
class A : Attribute
{
public A(int b)
{
GetType().GetCustomAttributes(true);
}
}
在此示例中,创建新的A
实例会导致StackOverflowException
,但如果我删除对GetCustomAttributes()
的调用,则执行正常进行。
这是为什么?对我来说更有意义的是,当他们装饰的类是属性时,属性被正确初始化。
答案 0 :(得分:3)
为什么运行时需要在请求之前在类上实例化所有属性?这就像问为什么运行时不提前创建我的类的实例,以防我以后想要使用它。
属性是类上的元数据,它们不会以任何方式影响类工作。只有请求属性关心它的代码,没有其他人没有。所以当前的行为确实有意义。
答案 1 :(得分:2)
由于属性功能仅由主动查找相关属性的代码执行,因此运行时在首次使用属性之前实例化属性是浪费的 - 实际上,在程序的生命周期中,属性可能从不进行检查。
答案 2 :(得分:1)
属性是与类型相关联的“信息”,而不是与实例相关联 当你创建一个附加类型的对象时,没有理由将它们实例化,而是在你检查类型本身时可以看到它们。