Подтвердить что ты не робот

Синтаксис инициализатора

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

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

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

Из того, что я могу сказать, он устанавливает MaxArrayLength свойство ReaderQuotas имущества WSHttpBinding.

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

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

4b9b3361

Ответ 1

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

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

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

Ваш код в целом сопоставим с:

var binding = new WSHttpBinding();
binding.ReaderQuotas.MaxArrayLength = 100000;
binding.MaxReceivedMessageSize = 10485760;

Ответ 2

Это немного запутанно, я согласен.

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

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

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

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