Этот код устанавливает значения через аксессоры вскоре после создания объекта - PullRequest
2 голосов
/ 16 мая 2011
var dlg = new Microsoft.Win32.OpenFileDialog
{
    Title = "Select configuration",
    DefaultExt = ".xml",
    Filter = "XML-file (.xml)|*.xml",
    CheckFileExists = true
};

Я получил указанный выше кусок от этой записи.Часть внутри фигурных скобок, присваивающая значения через аксессоры.Кажется, что нет конструкторов, поэтому подразумевается, что вызывается конструктор по умолчанию, а затем присваиваются значения свойств.

Ответы [ 4 ]

4 голосов
/ 16 мая 2011

То, что вы показали, называется инициализатором объекта , синтаксической функцией, представленной в 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.Вы можете сказать, что это конструктор по умолчанию, потому что параметры не передаются.

2 голосов
/ 16 мая 2011

Да, это идентично:

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

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

Он делает именно то, что вы уже догадались - вызвать конструктор, а затем использовать установщики открытого свойства.

1 голос
/ 16 мая 2011

Да, это синтаксический сахар.Для этого компилятор сгенерирует следующий код:

var dlg = new Microsoft.Win32.OpenFileDialog();
dlg.Title = "Select configuration";
dlg.DefaultExt = ".xml";
dlg.Filter = "XML-file (.xml)|*.xml";
dlg.CheckFileExists = true;
1 голос
/ 16 мая 2011

Да, это подразумевает тот же i-e, созданный с помощью конструктора по умолчанию и использовавший средства доступа для присвоения значения, его синтаксис .net3.5 или выше для поддержки инициализации объекта

...