【问题标题】:Why isn't a static constructor invoked on a class used as a generic type parameter?为什么不对用作泛型类型参数的类调用静态构造函数?
【发布时间】:2012-08-06 02:48:33
【问题描述】:

给定以下类:

public class Foo {
    static Foo() {
        Console.WriteLine("Foo is being constructed");
    }
}

public class Bar {
    public void ReferenceFooAsGenericTypeParameter<T>() {
        Console.WriteLine("Foo is being referenced as a generic type parameter");
    }
}

public class SampleClass
{
    public static void Main()
    {
        new Bar().ReferenceFooAsGenericTypeParameter<Foo>();
    }
}

输出是

Foo 被引用为泛型类型参数

根据规范,这是有道理的:

在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类。

但我很好奇为什么当类型被引用为泛型类型参数时不调用静态构造函数。

【问题讨论】:

  • 好问题伙伴,今天这个有点我

标签: c# generics static-constructor


【解决方案1】:

为什么需要这样?

正常调用静态构造函数的要点是确保在静态构造函数中设置的任何状态在首次使用之前都已初始化。

仅使用Foo 作为类型参数不会使用其中的任何状态,因此无需调用静态构造函数。

您可能想尝试创建具有副作用的静态变量初始化程序(例如,然后打印到控制台的方法调用)并删除静态构造函数 - 在某些情况下 can affect the timing of initialization significantly。它可能在这里触发它。

【讨论】:

  • 我想的也差不多。感谢您的澄清和链接。
【解决方案2】:

这是因为你不能仅仅通过包含作为泛型类型参数以任何有意义的方式实际使用类型内容,类型需要对其进行一些处理以保证调用静态构造函数。

你说得对,这符合规范。第 10.12 节(静态构造函数)指出:

静态构造函数的执行 由以下事件中的第一个触发 应用领域:

· 创建类类型的实例。

· 类类型的任何静态成员都被引用。

用作泛型类型参数不是这些。

【讨论】:

  • 问题已经承认行为符合规范,但询问为什么规范是这样编写的。
  • @hvd 谢谢,错过了。答案变了。
【解决方案3】:

这里要注意的是,在 new Bar().ReferenceFooAsGenericTypeParameter&lt;Foo&gt;(); 中,您创建了一个 Bar 类型的对象,您的 main 和 Bar 都没有创建 Foo 的实例,也没有它的任何成员被访问,在所呈现的情况下,类型本身只是作为参数传递。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多