我对以下代码感到好奇:
public static class Container<T>
{
public static readonly T[] EmptyArray = new T[0];
}
我理解,当执行以下代码时,静态类容器将被初始化:
...
var emptyArray = Container<int>.EmptyArray;
...
我理解你的意思了,静态泛型类/成员初始化的任何解释都将受到赞赏。先谢谢。
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());
}
}
输出:
1
2
1
静态字段初始化器实际上是被移动到类的静态构造函数(类型初始化器)中。所以您的代码会自动编译成以下内容:
public static class Container<T>
{
public static readonly T[] EmptyArray;
static Container()
{
EmptyArray = new T[];
}
}
关于静态构造函数,MSDN的解释如下:
在创建第一个实例或引用任何静态成员之前,将自动调用它[静态构造函数]。
由于Container<string>
和Container<bool>
不同,因此对于每种类型的T
,静态构造函数会被调用一次。