Синтаксис инициализатора
Мне нравится синтаксис инициализатора C# 3, и я часто его использую, но сегодня, глядя на Reflector, возникло следующее:
var binding = new WSHttpBinding
{
ReaderQuotas = { MaxArrayLength = 100000 },
MaxReceivedMessageSize = 10485760
};
Сначала я подумал, что это ошибка, но она компилируется! Думаю, я все еще изучаю новые вещи все время.:)
Из того, что я могу сказать, это устанавливает MaxArrayLength
собственность ReaderQuotas
собственность WSHttpBinding
,
Создает ли этот синтаксис новый ReaderQuotas
объект, а затем установить свойство, или оно предполагает, что свойство уже инициализировано? Это общий способ, который можно использовать для инициализации дочерних свойств?
Я нахожу синтаксис немного запутанным...
2 ответа
Нет, это не создает новые объекты, если вы не используете = new SomeType {...}
:
var binding = new WSHttpBinding
{
ReaderQuotas = new XmlDictionaryReaderQuotas { MaxArrayLength = 100000 },
MaxReceivedMessageSize = 10485760
};
В вашем примере показан синтаксис инициализатора для установки свойств существующих подобъектов. Существует также похожий синтаксис для вызова методов "Добавить" в коллекциях.
Ваш код в целом сопоставим с:
var binding = new WSHttpBinding();
binding.ReaderQuotas.MaxArrayLength = 100000;
binding.MaxReceivedMessageSize = 10485760;
Это немного сбивает с толку, я согласен.
Вам следует прочитать раздел 7.6.10.2 спецификации; там все объясняется. Например:
Инициализатор члена, который задает выражение после знака равенства, обрабатывается так же, как присвоение полю или свойству.
Инициализатор члена, который указывает инициализатор объекта после знака равенства, является инициализатором вложенного объекта, то есть инициализацией внедренного объекта. Вместо назначения нового значения полю или свойству, назначения в инициализаторе вложенного объекта обрабатываются как присвоения членам поля или свойства. Инициализаторы вложенных объектов нельзя применять к свойствам с типом значения или к полям только для чтения с типом значения.
Инициализатор элемента, который указывает инициализатор коллекции после знака равенства, является инициализацией встроенной коллекции. Вместо назначения новой коллекции полю или свойству элементы, заданные в инициализаторе, добавляются в коллекцию, на которую ссылается поле или свойство.