通用静态字段初始化

dan*_*oid 5 c# generics static

我只是对以下代码感到好奇:

public static class Container<T>
{
    public static readonly T[] EmptyArray = new T[0];
}
Run Code Online (Sandbox Code Playgroud)

正如我所理解的,当执行以下代码时,将初始化静态类Container:

...
var emptyArray = Container<int>.EmptyArray;
...
Run Code Online (Sandbox Code Playgroud)

我对吗 ?有关静态泛型类/成员初始化的任何解释都将受到赞赏.提前致谢.

por*_*ges 8

保证静态字段在您访问之前已初始化.(而且,如果还有静态构造函数,那么在运行静态构造函数之前将初始化所有静态字段.)

对于泛型类,静态初始化基于每个类型工作,因此Container<int>就好像它是一个完全不同的类Container<double>.这对于泛型类的所有静态部分实际上都是如此 - 每个类型都有自己的"副本".

一个例子将更清楚地显示最后一点:

static class Foo<T>
{
    static int count = 0;
    public static int Increment()
    {
        return ++count;
    }
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(Foo<int>.Increment());
        Console.WriteLine(Foo<int>.Increment());
        Console.WriteLine(Foo<double>.Increment());
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

1
2
1
Run Code Online (Sandbox Code Playgroud)


vcs*_*nes 5

静态字段初始值设定项实际上移到类的静态构造函数(类型初始值设定项)中。所以你的代码会自动编译成这个:

public static class Container<T>
{
    public static readonly T[] EmptyArray;

    static Container()
    {
        EmptyArray = new T[];
    }
}
Run Code Online (Sandbox Code Playgroud)

MSDN关于静态构造函数:

在创建第一个实例或引用任何静态成员之前,它会自动调用 [静态构造函数]。

由于Container<string>Container<bool>不相同,因此对于每种类型的T.