2013-03-13 68 views
6

我aproblem靜態變量聲明在C#中的順序靜態變量爲了

當我運行這段代碼:

static class Program { 
    private static int v1 = 15; 
    private static int v2 = v1; 

    static void Main(string[] args) { 
    Console.WriteLine("v2 = "+v2); 
    } 
} 

輸出是:

v2=15 

但是,當我改變靜態變量聲明的命令如下:

static class Program { 
     private static int v2 = v1; 
     private static int v1 = 15; 


     static void Main(string[] args) { 
     Console.WriteLine("v2 = "+v2); 
     } 
    } 

輸出結果爲:

v2 = 0 

爲什麼會發生這種情況?

+2

這不是聲明式編程,就像在Prolog中一樣。在C#命令中有一個命令它們運行。在這種情況下,它是直接的... – ppeterka 2013-03-13 14:58:46

+0

你知道嗎,如果你定義v1如:'private const int v1 = 15;'你得到15而不是0? – 2013-03-13 15:06:30

回答

11

靜態字段的初始化順序與聲明相同。當您使用的v1值初始化v2v1是尚未初始化,所以它的值是0

3

靜態變量獲得值的方式意味着在第二個示例中,v1未初始化,因此在將其分配給v2時,默認值爲0。

5

靜態變量在其聲明的順序進行初始化,所以當你在你的第二個例子分配v2v1仍然有其默認值0

我希望你知道,做這樣的事情是一個壞主意。

3

static字段的初始化順序如下其聲明。

在您的第二個代碼中,v1未初始化。由於v1Int32,所以它是一個值類型,所有值類型的默認值是0

從C#4.0中的頁面上的果殼74

靜態字段初始化的順序運行中的字段聲明 。

對你而言;

private static int v2 = v1; 
// v2 initialized 0 because of the default value of value types. 
private static int v1 = 15; 
// v1 initialized 15