2014-11-06 284 views
0

這將是一個快速的問題。我不太明白爲什麼會這樣,所以我會告訴你什麼是困擾我通過簡單的例子..聲明和初始化結構變量

第一個例子:

private static Point pt; 

public static void Main(string[] args) 
{ 
    pt.Display(); 
} 

public struct Point 
{ 
    public int X; 
    public int Y; 

    public void Display() 
    { 
     Console.WriteLine("X = {0}, Y = {1}", X, Y); 
    } 
} 

第二個例子:

public static void Main(string[] args) 
{ 
    Point pt; 
    pt.Display(); 
} 

public struct Point 
{ 
    public int X; 
    public int Y; 

    public void Display() 
    { 
     Console.WriteLine("X = {0}, Y = {1}", X, Y); 
    } 
} 

我可能會丟失一些明顯的東西,但第一個例子編譯正確,我在控制檯上得到輸出,而在第二個例子中它甚至不會編譯,因爲:

本地變量'pt'在訪問之前可能未被初始化。

好吧,它在第一種情況下也沒有初始化,但是它完成了工作,有什麼意義呢?

P.S.沒有雙關語意。

回答

3

在第一種情況下,它是一個static字段,它將由編譯器自動初始化。在第二種情況下,它是一個局部變量,您負責初始化它,而不是編譯器。

+0

哦,靜態關鍵字指示編譯器將變量初始化爲默認值? – msmolcic 2014-11-06 22:08:25

+0

@Smola不,它與靜態無關。對於所有的班級領域來說都是如此。如果你有一個引用類型字段並且不初始化它,你將不會得到一個未初始化的錯誤,但是如果你試圖訪問它的成員,你將在運行時得到一個NullReferenceException,因爲null是引用類型的默認值。 – 2014-11-06 22:08:51

+0

那麼,如果我得到它的權利包含主要方法的新類已經自動創建,當我運行我的程序?就像我寫MyClass class = new MyClass();它會自動初始化我的Point結構,並將其變量設置爲默認值,但在第二個示例中,情況並非如此,因爲Point不是我啓動類的私有成員,而是我的主方法中的局部變量? – msmolcic 2014-11-06 22:14:41

2

未初始化的類成員不會導致該編譯器錯誤,因爲它們的作用域太寬,不能確定編譯器是否可以在其他地方初始化。它可以在構造函數,任何其他類方法中初始化,或者在外部如果它是public。通過在本地範圍內聲明的變量,編譯器可以輕鬆確定變量是否在使用前被初始化。

一個結構的「默認」值與它的每個字段設置爲它的類型的默認值的結構,讓你有效地得到一分與(0,0)XY值。

如果你已經宣佈Pointclass,而不是一個struct你會在運行時已經獲得了NullReferenceException因爲當你調用pt.Display()參考將有一個空值。