2012-09-20 142 views
0

静态构造函数如何在这里表现?静态构造函数的行为(C#)

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

如何?

回答

7

这是,除了情况下,给出的确切示例here,其中给出以下解释:

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

0
  1. b.y被初始化,造成a得到初始化,所以
  2. a()被调用时,设置a.xb.y + 1b.y仍然初始化为它的默认,0)
  3. b.y然后设置为a.x + 1a.x已被初始化为1)

我会避免在真实世界的代码,虽然...

4

一切从这一行开始

public static int y = a.x + 1;

  • 它去a.x
  • a类型,所以public static int x;初始化,并且静态

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

构造函数调用后。

  • 在这个构造函数b.y已经staticaly initilized所以我们得到b.y当前值,这是0

这样x = 0 + 1

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

其中a.x1,因此它成为int y = 1 + 1;

0

记住b.y的开始是默认值0,所以在设置的y值,a.x将成为1.

0

从C#规格

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

线

x = b.y + 1; 

是因为此时它尚未能eveluate由值和值作为

x = 0 +1; 

执行的是为此它的默认值(0)

程序然后继续以评价语句

y = a.x + 1; 

并且由于斧在上面的语句分配值1以上是

y = 1 + 1; 

结果到底是x == 1y == 2