什麼你已經證明被稱爲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 question和this 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
。你可以告訴它是默認的構造函數,因爲沒有參數傳入。
這有點誤導......它不是**完全相同。 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
它幾乎是相同的 - 編譯器實際上引入了一個新變量來接受構造對象並執行屬性訪問,然後在發生後爲'dlg'變量賦值相同的引用。對var'(或任何局部變量)不重要,但對分配給多個線程可見的字段很重要。 – 2011-05-16 10:42:11