[英]Generic static fields initialization
我只是对以下代码感到好奇:
public static class Container<T>
{
public static readonly T[] EmptyArray = new T[0];
}
据我所知,静态类 Container 将在以下代码执行时初始化:
...
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
都会调用一次静态构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.