C# 通用静态字段初始化

C# 通用静态字段初始化,c#,generics,static,C#,Generics,Static,我只是对以下代码感到好奇: public static class Container<T> { public static readonly T[] EmptyArray = new T[0]; } 公共静态类容器 { public static readonly T[]EmptyArray=new T[0]; } 据我所知,静态类容器将在执行以下代码时初始化: ... var emptyArray = Container<int>.EmptyArray;

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

public static class Container<T>
{
    public static readonly T[] EmptyArray = new T[0];
}
公共静态类容器
{
public static readonly T[]EmptyArray=new T[0];
}
据我所知,静态类容器将在执行以下代码时初始化:

...
var emptyArray = Container<int>.EmptyArray;
...
。。。
var emptyArray=Container.emptyArray;
...

我说得对吗?如对静态泛型类/成员初始化有任何解释,将不胜感激。提前感谢。

保证在访问静态字段之前对其进行初始化。(而且,如果还有静态构造函数,那么在运行静态构造函数之前,所有静态字段都将被初始化。)

对于泛型类,静态初始化在每个类型的基础上工作,因此
Container
就像它是与
Container
完全不同的类一样。这实际上适用于泛型类的所有静态部分-每个类型都有自己的“副本”

一个例子将更清楚地说明最后一点:

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());
    }
}

静态字段初始值设定项实际上被移动到类的静态构造函数(类型初始值设定项)中。因此,您的代码会自动编译成:

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

    static Container()
    {
        EmptyArray = new T[];
    }
}
公共静态类容器
{
公共静态只读T[]空数组;
静态容器()
{
EmptyArray=新T[];
}
}
关于静态构造函数:

在创建第一个实例或引用任何静态成员之前,会自动调用它[Static Constructor]


由于
Container
Container
是不同的,对于每种类型的
T

静态构造函数调用一次,我误解了静态构造函数的概念-我认为静态构造函数是在程序的一开始就调用的,所以这个代码示例对我来说非常奇怪。谢谢。@danyloid:允许运行时在使用类成员之前随时调用静态构造函数。这可能是在程序开始时,或者在您第一次实际使用它之前。哦,答案是“是”:
public static class Container<T>
{
    public static readonly T[] EmptyArray;

    static Container()
    {
        EmptyArray = new T[];
    }
}