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)
我对吗 ?有关静态泛型类/成员初始化的任何解释都将受到赞赏.提前致谢.
保证静态字段在您访问之前已初始化.(而且,如果还有静态构造函数,那么在运行静态构造函数之前将初始化所有静态字段.)
对于泛型类,静态初始化基于每个类型工作,因此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)
静态字段初始值设定项实际上移到类的静态构造函数(类型初始值设定项)中。所以你的代码会自动编译成这个:
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.