你有任何想法,为什么以下代码:
public class A
{
public static int i = B.i + 1;
}
public class B
{
public static int i = A.i + 1;
}
Run Code Online (Sandbox Code Playgroud)
有:
int aa = A.i;
int bb = B.i;
Run Code Online (Sandbox Code Playgroud)
说aa = 2(!!!)和bb = 1.
我脑子里有一个堆叠溢出!据我所知,递归在静态方法上停止,但为什么呢?如果你将int i重新编写为getter(为了调试并理解它为什么会这样工作),你会得到堆栈溢出异常.
毫无疑问,执行就像这样:
在B.i
静态初始化首先运行,并设置B.i = A.i + 1
.既然A.i
尚未初始化,A.i
则等于default(int)
,即0
. B.i
获得价值1
.
在A.i
静态初始化运行第二个,并设置A.i = B.i + 1 = 2
.
由于静态初始化程序以未定义的顺序运行,因此您可能会发现2
每次运行时都有一个不同的字段,或者当您对代码进行其他结构更改时它们会切换.但是,人们应该总是这样2
,而且应该永远都是1
.
PS这与多态性无关.
编辑: 为了进一步了解静态初始化器和构造函数的时序,您可能需要检查C#规范的相关部分.