2011-05-16 44 views
2
var dlg = new Microsoft.Win32.OpenFileDialog 
{ 
    Title = "Select configuration", 
    DefaultExt = ".xml", 
    Filter = "XML-file (.xml)|*.xml", 
    CheckFileExists = true 
}; 

我從this後得到了上面的一塊。大括號內的部分是通過訪問器分配值的。似乎沒有構造函數,所以它暗示默認的構造函數被調用,然後分配屬性值。對象創建後不久通過訪問器的代碼設置值

回答

4

什麼你已經證明被稱爲object initializer,介紹了C#3.0中的語法功能。

類似下面的代碼,從而產生在第一行的對象,然後,單獨地設定在後續行其屬性:

var dlg = new Microsoft.Win32.OpenFileDialog(); 
dlg.Title = "Select configuration"; 
dlg.DefaultExt = ".xml"; 
dlg.Filter = "XML-file (.xml)|*.xml"; 
dlg.CheckFileExists = true; 

然而,不相同到上面的代碼。當您使用對象初始值設定項時,編譯器將創建一個臨時變量,設置該臨時變量中包含的對象的屬性,然後將該臨時變量分配給您聲明的實際變量。最終的結果是創建對象實例是原子。有關更多詳細信息,請參閱this questionthis blog post的答案。

在實踐中,你能想象得到的代碼看起來像這樣,當完全展開:

var temporaryDlg = new Microsoft.Win32.OpenFileDialog(); 
temporaryDlg.Title = "Select configuration"; 
temporaryDlg.DefaultExt = ".xml"; 
temporaryDlg.Filter = "XML-file (.xml)|*.xml"; 
temporaryDlg.CheckFileExists = true; 

var dlg = temporaryDlg; 

至於你的問題有關,其構造函數被調用,是的,這是在兩種情況下,默認的構造函數。第一行是對構造函數的調用,當它說new。你可以告訴它是默認的構造函數,因爲沒有參數傳入。

1

是的,這意味着與默認構造函數創建和使用存取分配的值相同,即,其在.NET3.5或上面的語法,以支持對象的初始化

2

是的,它是相同的:

var dlg = new Microsoft.Win32.OpenFileDialog(); 

dlg.Title = "Select configuration"; 
dlg.DefaultExt = ".xml"; 
dlg.Filter = "XML-file (.xml)|*.xml"; 
dlg.CheckFileExists = true; 

它確實是你猜到的 - 調用構造函數,然後使用公共屬性設置。

+3

這有點誤導......它不是**完全相同。 C#中的對象初始化器是原子的,而你的例子不是。編譯器創建一個臨時變量,爲其分配屬性,然後將該臨時變量分配給您聲明的實際變量。更多信息是[here](http://stackoverflow.com/questions/1679780/when-using-object-initializers-why-does-the-compiler-generate-an-extra-local-var)。 – 2011-05-16 10:41:07

+2

它幾乎是相同的 - 編譯器實際上引入了一個新變量來接受構造對象並執行屬性訪問,然後在發生後爲'dlg'變量賦值相同的引用。對var'(或任何局部變量)不重要,但對分配給多個線程可見的字段很重要。 – 2011-05-16 10:42:11

1

是的,這是句法糖。編譯器會生成此下面的代碼:

var dlg = new Microsoft.Win32.OpenFileDialog(); 
dlg.Title = "Select configuration"; 
dlg.DefaultExt = ".xml"; 
dlg.Filter = "XML-file (.xml)|*.xml"; 
dlg.CheckFileExists = true; 
+0

這是不正確的; C#中的對象初始化器不僅僅是純粹的語法糖。看到我的評論JK的答案。 – 2011-05-16 10:41:48

+0

感謝您提供額外的深度!看起來像一個常見的誤解:) – MattDavey 2011-05-16 12:16:31