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

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

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

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

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

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

Я действительно нахожу синтаксис немного сбивающим с толку...

29
задан Alexei Levenkov 22 May 2019 в 21:07
поделиться

2 ответа

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

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

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

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

var binding = new WSHttpBinding();
binding.ReaderQuotas.MaxArrayLength = 100000;
binding.MaxReceivedMessageSize = 10485760;
22
ответ дан 28 November 2019 в 01:55
поделиться

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

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

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

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

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

14
ответ дан 28 November 2019 в 01:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: