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

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

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

сначала я подумал, что это ошибка, но она компилируется! Наверное, я все еще учусь чему-то новому. :)

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

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

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

2 ответов


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

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

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

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

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

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

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

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

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

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