11

给定以下类:

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 被引用为泛型类型参数

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

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

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

4

3 回答 3

6

为什么需要这样?

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

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

您可能想尝试创建具有副作用的静态变量初始化程序(例如,然后打印到控制台的方法调用)并删除静态构造函数——这在某些情况下会显着影响初始化的时间。可能会在这里触发它。

于 2012-08-08T22:10:13.900 回答
1

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

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

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

· 创建类类型的一个实例。

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

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

于 2012-08-08T22:13:45.320 回答
0

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

于 2012-08-08T22:15:09.843 回答