0

静态构造函数在这里的行为如何?

class a
{    
    public static int x;
    static a()
    {
        x = b.y + 1;    
    }
}

class b    
{    
    public static int y = a.x + 1;

    static b()
    { 

    }

    static void Main(String[] args)
    {
       Console.WriteLine("x={0} , y={1} ", a.x, b.y);
        Console.ReadLine();    
    }
}

输出 ::

x=1 , y=2

如何 ?

4

5 回答 5

7

除了 case 之外,这是此处给出的确切示例,它给出了以下解释:

为了执行 Main 方法,系统首先运行 BY 的初始化程序,然后再运行 B 类的静态构造函数。Y 的初始化程序导致 A 的静态构造函数运行,因为引用了 AX 的值。A 的静态构造函数依次继续计算 X 的值,并在此过程中获取 Y 的默认值,即零。AX因此被初始化为1。A的静态字段初始化器和静态构造器的运行过程结束,返回到Y的初始值的计算,其结果变为2。

于 2012-09-20T14:34:37.213 回答
4

一切从这条线开始

public static int y = a.x + 1;

  • 它去a.x
  • 之后a键入,如此public static int x;初始化,并且是静态的

    static a()
    {
        x = b.y + 1;    
    }
    

ctor 调用。

  • 在这个 ctorb.y中已经静态初始化,所以我们得到b.y 当前0值,即

所以x = 0 + 1

  • 我们回来后public static int y = a.x + 1;

在哪里a.x1所以它变成int y = 1 + 1;

于 2012-09-20T14:34:06.873 回答
0
  1. b.y被初始化,导致a被初始化,所以
  2. a()被调用,设置a.xb.y + 1b.y仍然初始化为其默认值,0)
  3. b.y然后设置为a.x + 1(a.x已初始化为 1)

我会在现实世界的代码中避免这种情况......

于 2012-09-20T14:31:10.203 回答
0

请记住,b.y从默认值 0 开始。因此,在设置 的值时ya.x将变为 1。

于 2012-09-20T14:34:15.193 回答
0

来自 C# 规范

为了执行 Main 方法,系统首先运行 BY 的初始化程序,然后再运行 B 类的静态构造函数。Y 的初始化程序导致 A 的静态构造函数运行,因为引用了 AX 的值。A 的静态构造函数依次继续计算 X 的值,并在此过程中获取 Y 的默认值,即零。AX因此被初始化为1。A的静态字段初始化器和静态构造器的运行过程结束,返回到Y的初始值的计算,其结果变为2。

线

x = b.y + 1;

被执行为

x = 0 +1; 

因为此时还无法评估 by 的值,因此 by 的值是默认值 (0)

然后程序继续评估该语句

y = a.x + 1;

并且由于 ax 在上面的语句中被赋值为 1 上面是

y = 1 + 1;

x == 1最终的结果是y == 2

于 2012-09-20T14:37:46.053 回答