Ответ 1
здесь вы идете. Ключевое слово - "Инициализаторы массива".
http://msdn.microsoft.com/en-us/library/aa664573(v=vs.71).aspx
или, скорее, "Инициализаторы коллекции"
Я видел только фрагмент кода, который использует общий класс списка для создания экземпляра следующим образом:
var foo = new List<string>(){"hello", "goodbye"};
Кудрявые фигурные скобки после конструктора особенно сбивают с толку. Это немного напоминает мне
var bar = new string[]{"hi","bye"};
но в прошлом я всегда использовал:
var foo = new List<string>(new []{"hello", "goodbye"});
Кто-нибудь получил ссылку, объясняющую синтаксис в первой строке кода? Я даже не знал бы, с чего начать с его поиском.
здесь вы идете. Ключевое слово - "Инициализаторы массива".
http://msdn.microsoft.com/en-us/library/aa664573(v=vs.71).aspx
или, скорее, "Инициализаторы коллекции"
Как указывали другие, это инициализатор коллекции. Некоторые другие функции, о которых вы, возможно, не знаете, были добавлены в С# 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
для дополнительных мыслей о дизайне функции.
Это инициализатор коллекции: 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 разделить разрешение перегрузки против методов добавления для каждой записи в списке.
Это инициализатор коллекции. Вы можете использовать его в коллекциях с помощью метода 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");
В третьей строке кода вы указали, что вы создаете новый строковый массив, а затем передаете этот строковый массив в список. Затем список добавит каждый из этих элементов в список. Это связано с дополнительными накладными расходами на распределение массива, его заполнение и последующее отбрасывание.
Существует механизм, позволяющий классу определить, как использовать инициализаторы Collection для заполнения. (См. Другие ответы) Я никогда не нашел необходимости использовать это для своих собственных классов, но существующие структуры данных, такие как List, Dictionary, часто определяют их, и они полезны для использования.