直接来自ECMA-334:
17.4.5.1: “ 如果类中存在静态构造函数(第17.11节),则在执行该静态构造函数之前立即执行 静态字段初始化程序 。
否则,将在与实现相关的时间执行静态字段初始化程序 。 首先使用该类的静态字段。”
和:
17.11: 静态构造函数的执行由在应用程序域内发生的以下第一个事件触发:
- 创建该类的实例。
- 引用了该类的任何静态成员。
如果类包含开始执行的Main方法(第10.1节),则该类的静态构造函数将在调用Main方法之前执行。
如果类包含带有初始化程序的任何静态字段,则在执行静态构造函数之前,将按文本顺序执行这些初始化程序(第17.4.5节)。
因此顺序为:
A.X
用过的,static A()
所谓的。A.X
需要初始化,但使用B.X
,即static B()
所谓的。B.X
需要初始化,并初始化为7。B.X = 7
- 的所有静态字段
B
均已初始化,因此static B()
称为。X
打印(“ 7”),然后将其设置为A.X
。A
已经开始初始化,因此我们获得的值A.X
,这是默认值(“当初始化一个类时,该类中的所有静态字段都首先被初始化为其默认值”);B.X = 0
,然后打印(“ 0”)。 - 完成初始化
B
,并将的值A.X
设置为B.X+1
。A.X = 1
。 - 的所有静态字段
A
均已初始化,因此static A()
称为。A.X
打印(“ 1”)。 - 返回中
Main
,将打印A.X
和的值B.X
(“ 1”,“ 0”)。
它实际上在标准中对此进行了评论:
17.4.5: 可以在默认值状态下观察带有变量初始化器的静态字段。 但是,强烈不建议使用此样式。



