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

Что это за синтаксис с использованием нового, за которым следует список внутри фигурных скобок?

Я видел только фрагмент кода, который использует общий класс списка для создания экземпляра следующим образом:

var foo = new List<string>(){"hello", "goodbye"};

Кудрявые фигурные скобки после конструктора особенно сбивают с толку. Это немного напоминает мне

var bar = new string[]{"hi","bye"};

но в прошлом я всегда использовал:

var foo = new List<string>(new []{"hello", "goodbye"});

Кто-нибудь получил ссылку, объясняющую синтаксис в первой строке кода? Я даже не знал бы, с чего начать с его поиском.

4b9b3361

Ответ 2

Как указывали другие, это инициализатор коллекции. Некоторые другие функции, о которых вы, возможно, не знаете, были добавлены в С# 3:

  • Конструктор инициализатора коллекции может опускать круглые скобки, если список аргументов пуст. Итак, new List<int> { 10, 20, 30 } отлично.
  • Массив, инициализированный инициализатором массива, может в некоторых случаях опустить тип. Например, var myInts = new[] { 10, 20, 30}; указывает, что myInts есть int[].
  • Объекты могут быть инициализированы с использованием аналогичного синтаксиса инициализатора объекта. var c = new Customer() { Name = "Fred" }; совпадает с var temp = new Customer(); temp.Name = "Fred"; var c = temp;

Точка этих функций состоит в том, чтобы (1) делать больше вещей, которые требовали от операторов в вещах, требующих только выражений; LINQ любит, чтобы вещи были выражениями, и (2), чтобы включить более богатый вывод типа, особенно для анонимных типов.

Наконец: в некоторых ответах и ​​комментариях была некоторая путаница в отношении того, что требуется для инициализатора коллекции. Для использования с инициализатором коллекции тип должен (1) реализовать IEnumerable (так что мы знаем, что это коллекция) и (2) иметь метод Add (чтобы мы могли добавить к нему материал.)

См.

http://blogs.msdn.com/b/madst/archive/2006/10/10/what-is-a-collection_3f00_.aspx

для дополнительных мыслей о дизайне функции.

Ответ 3

Это инициализатор коллекции: http://msdn.microsoft.com/en-us/library/bb384062.aspx

Инициализируемый тип должен реализовывать IEnumerable и иметь метод Add. Элементы списка фигурных скобок передаются методу добавления; различные элементы в списке могут быть переданы различным методам Add. Если существует перегрузка Add с несколькими аргументами, вы помещаете несколько аргументов в список, разделенный запятыми, заключенный в фигурные скобки.

Например:

class MyWeirdCollection : IEnumerable
{
    public void Add(int i) { /*...*/ }
    public void Add(string s) { /*...*/ }
    public void Add(int i, string s) { /*...*/ }

    //IEnumerable implementation omitted for brevity
}

Этот класс может быть инициализирован таким образом:

var weird = new MyWeirdCollection { 1, "Something", {5, "Something else"} };

Это скомпилируется примерно так:

var temp = new MyWeirdCollection();
temp.Add(1);
temp.Add("Something");
temp.Add(5, "Something else");
var weird = temp;

В его сообщение в блоге (ссылка, добавленная Эриком Липпертом в комментариях), Mads Torgersen выражает это кратко:

Список, который вы предоставляете, не является "списком элементов для добавления", а "списком наборов аргументов для добавления методов".... [W] e разделить разрешение перегрузки против методов добавления для каждой записи в списке.

Ответ 4

Это инициализатор коллекции. Вы можете использовать его в коллекциях с помощью метода Add.

Пара скобок перед фигурными фигурными скобками необязательна.

Это очень удобно, потому что вы можете использовать его в коллекциях, отличных от списков, например, в словарях:

var x = new Dictionary<int,string> {{1, "hello"}, {2, "world"}};

Это позволяет избежать более длительной последовательности инициализации:

var x = new Dictionary<int,string>();
x.Add(1, "hello");
x.Add(2, "world");

Ответ 5

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

Существует механизм, позволяющий классу определить, как использовать инициализаторы Collection для заполнения. (См. Другие ответы) Я никогда не нашел необходимости использовать это для своих собственных классов, но существующие структуры данных, такие как List, Dictionary, часто определяют их, и они полезны для использования.