静态字段的有趣功能.StackOverflow异常

010*_*101 2 oop

你有任何想法,为什么以下代码:

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(为了调试并理解它为什么会这样工作),你会得到堆栈溢出异常.

mqp*_*mqp 6

毫无疑问,执行就像这样:

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#规范的相关部分.