【发布时间】:2011-05-10 19:27:26
【问题描述】:
class Test
{
private static int m = 10;
private static double n = 20;
public Test()
{
}
}
如果使用静态构造函数,则在构造类的第一个实例或引用第一个变量时初始化静态变量。如果我不使用静态构造函数,静态变量什么时候初始化,以什么顺序初始化。
【问题讨论】:
标签: c#
class Test
{
private static int m = 10;
private static double n = 20;
public Test()
{
}
}
如果使用静态构造函数,则在构造类的第一个实例或引用第一个变量时初始化静态变量。如果我不使用静态构造函数,静态变量什么时候初始化,以什么顺序初始化。
【问题讨论】:
标签: c#
C# 语言规范section 10.4.5.1 说:
如果类中存在静态构造函数,则执行静态字段初始值设定项 在执行之前立即发生 那个静态构造函数。否则, 静态字段初始化器是 在执行 之前的依赖于实现的时间 第一次使用静态字段 那个班级。
因此,它依赖于实现,但所有静态字段都保证在使用其中之一之前被初始化。
【讨论】:
在 C#4.0 中,静态字段在没有静态构造函数的情况下尽可能惰性地初始化。而在以前的版本中,我们无法给出准确的初始化时间。 Jon Skeet 对此有 a great post。
【讨论】:
同一个地方。 Compiler 为你输出静态构造函数。顺序是定义的一个成员。
如果用Reflector查看类,可以看到静态构造函数:
public class MyStaticClass
{
public static int MyInt = 10;
}
变成:
public class MyStaticClass
{
// Fields
public static int MyInt;
// Methods
static MyStaticClass();
public MyStaticClass();
}
与
static MyStaticClass()
{
MyInt = 10;
}
【讨论】: