首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#两个静态成员相互引用的类

C#两个静态成员相互引用的类
EN

Stack Overflow用户
提问于 2010-05-07 05:16:04
回答 4查看 712关注 0票数 18

我想知道为什么这段代码不会以无休止的递归结束。我猜它与将静态成员自动初始化为默认值有关,但有人能告诉我“一步一步”'a‘如何获得2的值,'b’如何获得1的值吗?

代码语言:javascript
复制
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();
}
EN

回答 4

Stack Overflow用户

发布于 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

票数 6
EN

Stack Overflow用户

发布于 2010-05-07 05:21:57

要加载的第一个类型恰好是A。所以这个类型被加载,它的静态成员a得到它的默认值0。之后,调用A的静态构造函数。该构造函数引用类型B,因此B也被加载,它的静态构造函数也被调用。该构造函数反过来引用类型A,但A已经加载,所以这里什么也没有发生,b的值是0(a的当前值)加1,这是1。之后,B的静态构造函数返回,并计算a的值。

票数 2
EN

Stack Overflow用户

发布于 2010-05-07 05:24:06

有趣的是,当我更改了示例代码中的输出顺序时:

代码语言:javascript
复制
    Console.WriteLine("B.b={0} A.a={1}", B.b, A.a);

我得到了相反的结果:

代码语言:javascript
复制
B.b=2 A.a=1

因此,它看起来与它们被访问的顺序有关

因此,如果输出可以通过添加一个变量的早期使用来改变,那么这样的递归定义的值似乎是一个坏主意(TM) :-)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2784558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档