我想知道为什么这段代码不会以无休止的递归结束。我猜它与将静态成员自动初始化为默认值有关,但有人能告诉我“一步一步”'a‘如何获得2的值,'b’如何获得1的值吗?
public class A
{
public static int a = B.b + 1;
}
public class B
{
public static int b = A.a + 1;
}
static void Main(string[] args)
{
Console.WriteLine("A.a={0}, B.b={1}", A.a, B.b); //A.a=2, B.b=1
Console.Read();
}
发布于 2010-05-07 05:20:08
它与您访问静态属性的顺序有关。第一个评估是A。A。在计算A.a时,B.b被初始化。由于a的实际赋值未完成,a的值仍为0,B.b变为1,B.b初始化后,可以赋值给A.a,即1+1,因此为2
发布于 2010-05-07 05:21:57
要加载的第一个类型恰好是A
。所以这个类型被加载,它的静态成员a
得到它的默认值0。之后,调用A
的静态构造函数。该构造函数引用类型B
,因此B
也被加载,它的静态构造函数也被调用。该构造函数反过来引用类型A
,但A
已经加载,所以这里什么也没有发生,b
的值是0(a
的当前值)加1,这是1。之后,B
的静态构造函数返回,并计算a
的值。
发布于 2010-05-07 05:24:06
有趣的是,当我更改了示例代码中的输出顺序时:
Console.WriteLine("B.b={0} A.a={1}", B.b, A.a);
我得到了相反的结果:
B.b=2 A.a=1
因此,它看起来与它们被访问的顺序有关
因此,如果输出可以通过添加一个变量的早期使用来改变,那么这样的递归定义的值似乎是一个坏主意(TM) :-)
https://stackoverflow.com/questions/2784558
复制相似问题