我刚开始好奇下面的代码:通用静态字段初始化
public static class Container<T>
{
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];
}
正如我已经理解了静态类容器将被初始化时,下面的代码执行:
...
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
哦,所以答案是“是”:) – porges
静态字段初始真的搬进类的静态构造函数(类型初始化)。所以,你的代码编译成这个自动的:
public static class Container<T>
{
public static readonly T[] EmptyArray;
static Container()
{
EmptyArray = new T[];
}
}
从MSDN关于静态构造函数:
它[静态构造函数]会自动创建第一个实例之前或调用的任何静态成员被引用。
由于Container<string>
和Container<bool>
是不一样的,静态构造函数为每种类型的T
调用一次。
是的你是正确的 –