2014-10-03 26 views
2

在下面的代碼中,如果我們使用常量字段,結果將會OK!但是當我們使用靜態字段時,結果不是預期的。添加三個靜態字段

爲什麼和如何?

class Program 
{ 
    private static int x = y + 100; 
    private static int y = z - 10; 
    private static int z = 300; 

    public static void Main(string[] args) 
    { 
     System.Console.WriteLine("{0}/{1}/{2}",x,y,z); // 100/-10/300 why and how? 
     Console.ReadKey(); 
    } 
} 
+1

你的輸出是錯誤的。它爲z返回正值300。 – juharr 2014-10-03 13:18:17

+0

感謝Juharr,它被糾正了。 – kokabi 2014-10-03 13:34:26

回答

8

成員變量在它們在文件中出現的順序初始化。在x初始化時,y和z都爲0.

+0

和常量成員? – kokabi 2014-10-03 13:17:08

+2

@ programmer1,常量被編譯代碼中的值替換,所以順序無關 – 2014-10-03 13:18:03

+1

http://blogs.msdn.com/b/csharpfaq/archive/2004/12/03/what-is-the -difference-const-and-static-readonly.aspx – 2014-10-03 13:18:56

2

z尚未初始化。改變你的初始化變量的順序。

class Program 
{ 
    private static int z = 300; 
    private static int y = z - 10;  
    private static int x = y + 100;  

    public static void Main(string[] args) 
    { 
     System.Console.WriteLine("{0}/{1}/{2}",x,y,z); 
     Console.ReadKey(); 
    } 
} 

回答

390/290/300 
+0

好吧,這只是一個示例代碼來顯示問題,它不是真正的代碼,無論如何,謝謝。 – kokabi 2014-10-03 14:56:22

2

常量表達式在編譯時(見C#規範的第7.19)充分評估。

由於允許常量表達式引用類的const成員,所以const成員的值是在編譯時計算的。這就是爲什麼您使用const字段獲得「正確」結果的原因。

將此與static字段進行比較,該字段在運行時按聲明的順序進行評估。