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

私はこの投稿から上記の得たものを手に入れました。アクセサを介して値を割り当てる中括弧内の部分です。コンストラクターがないように見えるので、デフォルトのコンストラクターが呼び出されてからプロパティ値が割り当てられることを意味します。

4

4 に答える 4

4

あなたが示したものは、オブジェクト初期化子と呼ばれ、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;

ただし、上記のコードと同じではありません。オブジェクト初期化子を使用すると、コンパイラは一時変数を作成し、その一時変数に含まれるオブジェクトにプロパティを設定してから、その一時変数を宣言した実際の変数に割り当てます。最終的な結果として、オブジェクト インスタンスの作成はアトミックになります。詳細については、この質問への回答とこのブログ投稿を参照してください。

実際には、完全に展開すると、結果のコードは次のようになると想像できます。

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です。パラメーターが渡されないため、これがデフォルトのコンストラクターであることがわかります。

于 2011-05-16T10:52:14.117 に答える
2

はい、次と同じです:

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

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

それはまさにあなたが推測したとおりに動作します - コンストラクターを呼び出してから、パブリック プロパティ セッターを使用します。

于 2011-05-16T10:21:51.743 に答える
1

はい、それは同じことを意味します。つまり、デフォルトのコンストラクターで作成され、アクセサーを使用して値を割り当てます。オブジェクトの初期化をサポートするための.net3.5以上の構文です

于 2011-05-16T10:21:35.647 に答える
1

はい、これはシンタックス シュガーです。コンパイラは、このために次のコードを生成します。

var dlg = new Microsoft.Win32.OpenFileDialog();
dlg.Title = "Select configuration";
dlg.DefaultExt = ".xml";
dlg.Filter = "XML-file (.xml)|*.xml";
dlg.CheckFileExists = true;
于 2011-05-16T10:22:44.043 に答える