То, что вы показали, называется инициализатором объекта , синтаксической функцией, представленной в 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;
Однако он не идентичен вышеуказанному коду.Когда вы используете инициализатор объекта, компилятор создаст временную переменную, установит свойства объекта, содержащегося в этой временной переменной, а затем назначит эту временную переменную реальной объявленной вами переменной.Конечным результатом является то, что создание экземпляра объекта является atomic .Более подробная информация доступна в ответах на этот вопрос и в этом сообщении в блоге .
На практике вы можете представить, что полученный код выглядит примерно так, когдаполностью расширен:
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
.Вы можете сказать, что это конструктор по умолчанию, потому что параметры не передаются.