2012-09-20 190 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