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[];
}
}