2015-11-13 85 views
0

我在MSDN讀到的當靜態字段初始化發生?

using System; 
class Test 
{ 
    static void Main() 
    { 
     Console.WriteLine("{0} {1}", B.Y, A.X); 
    } 

    public static int F(string s) 
    { 
     Console.WriteLine(s); 
     return 1; 
    } 
} 

class A 
{ 
    public static int X = Test.F("Init A"); 
} 

class B 
{ 
    public static int Y = Test.F("Init B"); 
} 

輸出可以是的

Init A 
Init B 
1 1 

Init B 
Init A 
1 1 

,但我想不出爲什麼X的excecution的順序初始值設定項和Y的初始值設定項可以按任何順序發生?

我總是得到第二個結果(我期望)在我的系統上,但看不到第一個結果也能實現?

謝謝。

+0

另一個不好的微軟例子。它總是第二,因爲聲明:B.Y,A.X.如果你有A.X,B.Y.關鍵是初始化將按照您使用變量的順序發生,而不是由寫入類的方式來控制。 – jdweng

+0

有趣。在writeline之前在F函數中放置一個隨機數的線程睡眠並運行應用程序幾次以查看它的功能。不幸的是,我剛離開辦公室,所以無法自己測試。 –

+0

@jdweng,哦....我明白爲什麼這是一個誤導性的例子。 – user3723486

回答

2

您正在閱讀語言規範,該規範告訴您根據語言規範允許發生什麼。您正在使用的語言的特定實現中看到一致的行爲,並且該行爲與規範一致,因此一切都很好。

語言規範警告你,你不應該依賴於你的程序中的行爲,因爲在未來版本的運行時(或在不同的處理器/平臺/星期幾),行爲可能會改變。