有些地方不太清楚,根据我所读的:
字段初始化程序
在构造函数之前运行。静态字段初始化程序
在调用静态构造函数
之前执行(仍然符合第一点)。- 如果类型没有静态构造函数,则会在使用该类型之前(理解为被使用而非实例化)执行
字段初始化程序
以下示例进行了说明:
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Foo.X);
Console.ReadLine();
}
}
class Foo
{
public static Foo Instance = new Foo();
public static int X = 3;
Foo()
{
Console.WriteLine("In constructor: " + X);
}
}
这段代码先打印0,然后是3!可能吗?当我们通过Foo.X使用Foo时,前两个初始化器会在构造函数之前被调用(到目前为止还好),当...
public static Foo Instance = new Foo();
在执行时,它应该在调用构造函数之前运行自己的两个初始化程序(第一点),而实际上它首先运行构造函数并以0作为默认值打印X。
我真的无法理解这个逻辑,请向我澄清。
编辑:我的预期结果是:
- Foo.X:执行:public static Foo Instance = new Foo();
- 在调用打印(“在构造函数中:”+ X)的构造函数之前,应该先执行public static int X = 3;,但事实上构造函数首先触发了。难道不应该首先完成字段的运行吗?我的意思是即使在跳转到创建新的Foo实例时,字段也必须先运行。
- 根据最后两点,我希望先打印3然后再打印3。
Foo.X
之后打印3。#为了使其更清晰,请将构造函数中的代码更改为:Console.WriteLine("In constructor: " + X);
。不太清楚您希望发生什么,但是当您在Foo
类型初始化程序内调用Foo
的构造函数时,类型初始化程序已经在运行,因此不会单独运行。 - Jon SkeetX = 3
,但没有解释为什么。对于Instance
的赋值无法完成直到构造函数完成,而这发生在X = 3
的赋值之前。请注意这里的两个字段都是静态字段 - 你所看到的只是静态字段初始化程序调用构造函数的副作用,从而允许另一个静态字段的默认值被看到。 - Jon Skeet