Синтаксис инициализатора - PullRequest
29 голосов
/ 07 января 2010

Мне нравится синтаксис инициализатора C # 3 и я его часто использую, но сегодня, глядя в Reflector, появилось следующее:

var binding = new WSHttpBinding
{
  ReaderQuotas = { MaxArrayLength = 100000 },
  MaxReceivedMessageSize = 10485760
};

Сначала я подумал, что это ошибка, но она компилируется! Думаю, я все еще изучаю новые вещи все время. :)

Насколько я могу судить, он устанавливает свойство MaxArrayLength свойства ReaderQuotas WSHttpBinding.

Создает ли этот синтаксис новый объект ReaderQuotas и затем устанавливает свойство, или оно предполагает, что свойство уже инициализировано? Это общий способ инициализации дочерних свойств?

Я нахожу синтаксис немного запутанным ...

Ответы [ 2 ]

22 голосов
/ 07 января 2010

Нет, это не создает новые объекты, если вы не используете = new SomeType {...}:

var binding = new WSHttpBinding
{
    ReaderQuotas = new XmlDictionaryReaderQuotas { MaxArrayLength = 100000 },
    MaxReceivedMessageSize = 10485760
};

В вашем примере показан синтаксис инициализатора для установки свойств существующих подобъектов. Существует также аналогичный синтаксис для вызова методов «Добавить» в коллекциях.

Ваш код в широком смысле сравним с:

var binding = new WSHttpBinding();
binding.ReaderQuotas.MaxArrayLength = 100000;
binding.MaxReceivedMessageSize = 10485760;
14 голосов
/ 07 января 2010

Это немного сбивает с толку, я согласен.

Вам следует прочитать раздел 7.6.10.2 спецификация; это все объясняется там. Например:

Инициализатор члена, который указывает выражение после знака равенства обрабатывается так же, как присвоение полю или свойству.

Инициализатор члена, который указывает инициализатор объекта после равенства знак является инициализатором вложенного объекта, то есть инициализация встроенного объект. Вместо назначения нового значение для поля или свойства, присваивания во вложенном объекте инициализатор обрабатываются как назначения членам поля или собственности. Инициализаторы вложенных объектов не могут быть применяется к свойствам со значением введите или только для чтения поля с тип значения.

Инициализатор члена, который указывает инициализатор коллекции после знак равенства является инициализацией встроенная коллекция. Вместо присвоение новой коллекции поле или свойство, заданные элементы в инициализаторе добавляются в коллекция, на которую ссылается поле или свойство.

...