2014-01-23 74 views
6

如果您使用初始化程序列表創建struct,那麼您離開的成員是否會獲得已知的默認值?未初始化的結構成員是否保證有值?

public struct Testing 
{ 
    public int i; 
    public double d; 
    public string s; 
} 

Testing test = new Testing { s="hello" }; 

我發現在微軟暗示,但沒有說明明確這樣一個鏈接:Default Values Table (C# Reference)

一個小測試程序顯示它不會產生編譯器錯誤併產生預期的結果。我知道比依靠簡單的測試來保證更好。 http://ideone.com/nqFBIZ

回答

9

是的,它們包含默認值(T),其中T是值的類型。 對象引用將爲空。

摘錄:

正如在5.2節所述,幾種變量 自動被 創建時初始化爲它們的默認值。對於類類型和其他參考類型的變量,此 默認值爲空。但是,由於結構是 不能爲空的值類型,因此結構的默認值是由 產生的值將所有值類型字段設置爲其默認值,並且所有引用 類型字段都爲空。

從這裏摘自:

http://msdn.microsoft.com/en-us/library/aa664475(v=vs.71).aspx

我記得學習商務部的認證,他們明確地說明這一點的時候。這是該語言的一個保證功能。

6

爲了擴展PID的回答是:

test = new Testing { s = hello } 

被指定爲具有的語義:

Testing temp = new Testing(); 
temp.s = "hello"; 
test = temp; 

值類型的默認構造函數記錄爲構造其將所有的實例的字段設置爲默認值。

更一般地,C#語言要求任何構造值類型的具有所有字段是明確賦值構造正常終止之前的特性。

現在,如果沒有構造函數被調用,那麼就有兩種情況。如果變量最初分配爲,那麼該變量的作用與默認構造函數被調用時相同。例如,如果你說

Testing[] test = new Testing[1]; 

然後test[0]被初始化爲默認值一樣,如果你說

Testing[] test = new Testing[1] { new Testing() }; 

如果變量不是最初分配,例如,本地變量,那麼必須明確分配所有的字段,然後再閱讀它們。也就是說,如果我們有一個本地:

Testing test; 
test.s = "hello"; 
Console.WriteLine(test.d); // ERROR, test.d has not been written yet. 

還要注意,可變結構是C#中最糟糕的做法。相反,建立一個公共構造函數來設置所有的字段,使這些字段保持私有狀態,並將屬性獲取器置於其上。