【问题标题】:Why are attributes lazily instantiated?为什么属性被延迟实例化?
【发布时间】:2010-09-02 05:31:04
【问题描述】:

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

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

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

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

【问题讨论】:

  • 类被初始化是什么意思?你认为这会在什么时候发生?

标签: c# .net attributes lazy-initialization


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-21
        相关资源
        最近更新 更多