Что эти дополнительные фигурные скобки делают в C #?

#c#

#c#

Вопрос:

Я понятия не имею, как искать этот вопрос; простите меня, если это излишне.

Итак, у меня есть такой код:

 textBox1.InputScope = new InputScope { Names = { _Scope } };
 

Свойство Names имеет тип IList

Мой код добавляет элемент в список или создает новый список?

Что делает эта дополнительная фигурная скобка?

Ответ №1:

Это инициализатор коллекции, но он не создает новую коллекцию — он просто добавляет к существующей. Он используется как часть инициализатора-значения инициализатора-члена в инициализаторе объекта. Это эквивалент:

 InputScope tmp = new InputScope();
tmp.Names.Add(_Scope);
textBox1.InputScope = tmp;
 

См. Раздел 7.6.10.3 спецификации C # 4 для получения дополнительной информации.

Комментарии:

1. Это похоже на трюк с двойными фигурными скобками в Java за вычетом ужасающих последствий анонимного класса?

2. @G_H: Несколько … легче говорить об этом только с точки зрения того, что он на самом деле делает в C #, а не о том, как его можно плохо эмулировать в Java 🙂

3. @Джон, тогда почему это не var _List = new List<int> { 1, 2, 3 }; _List = { 4, 5, 6 }; работает? Потому что это можно сделать только один раз?

4. @JerryNixon: инициализаторы коллекции могут отображаться только как часть выражений создания объекта. Вы все равно можете это сделать _List = new List<int> { 1, 2, 3 } .

5. @Джон, надеюсь, не слишком не по теме. Существует ли синтаксис добавления более одного за раз для перечислимых, который выполнял бы что-то вроде этого синтаксиса там? Что-то вроде _List.AddRange({ 4, 5, 6});? Я полностью понимаю, почему это не работает. Но что-нибудь подобное?

Ответ №2:

Это инициализатор коллекции. Это позволяет вам добавлять элементы в Names коллекцию.

Ответ №3:

 new InputScope { // indicates an object-initializer for InputScope using
                 // the default constructor
   Names = { // indicates an in-place usage of a collection-initializer
     _Scope  // adds _Scope to Names
   } // ends the collection-initializer
}; // ends the object-initializer
 

т.е.

 var tmp = new InputScope();
tmp.Names.Add(_Scope);
textBox1.InputScope = tmp;
 

Ответ №4:

Первый набор фигурных скобок — это инициализатор объекта. Второй набор — это список имен (коллекция).

Комментарии:

1. Отредактировано в соответствии с документацией — как массивы, так и коллекции (я перечисляю здесь ) поддерживают инициализацию объекта одинаково. Я предположил, что это массив. Спасибо за разъяснения!