Синтаксис инициализации коллекции, для чего? - PullRequest
1 голос
/ 21 октября 2010

Мы просто можем использовать такие функции, как

public static List<T> New<T>(params T[] items) {
    return new List<T>(items);
}

и, что более важно, лучше

var list = new List<int> {1,2,3};
var list = List.New(1,2,3);

Итак, когда нам действительно нужно использовать это?

Словарь

public static Dictionary<T, K> New<T, K>(T key, K value) {
    return new Dictionary<T,K>().FAdd(key, value);
}

var dict = new Dictionary<int, string>(){
 {1, "a"},
 {2, "b"}
};

var dict = Dict.New(1,"a").FAdd(2, "b");

Почему лучше, вывод типа

var x = new Dictionary<string, List<int>>(){
   {"a", new List<int>{1}},
   {"b", new List<int>{2}},
}

var x = Dict.New("a", List.New(1)).FAdd("b", List.New(2));

Ответы [ 3 ]

8 голосов
/ 21 октября 2010

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

Кроме того, использование языковой функциональности вместо использования собственного метода сделает код более понятным для других разработчиков. Поскольку вы используете стандартную языковую функцию, намерение становится очевидным. Использование метода расширения может легко замаскировать ваши намерения.

Итак, когда нам действительно нужно это использовать?

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

7 голосов
/ 21 октября 2010

Одна проблема с вашим образцом заключается в том, что он гораздо менее эффективен, чем оператор инициализатора коллекции.Использование params заставляет коллекцию создаваться дважды

  1. Один раз для создания массива .Net для значений
  2. Создание фактической коллекции

С другой стороны, инициализаторы коллекции просто создают вторую коллекцию.

В целом, хотя одной из основных причин инициализаторов коллекций не является необходимость написания этого API.В структуре есть множество коллекций с неудачным разнообразием создания шаблонов.Многие не имеют конструктора, принимающего IEnumerable, и вместо этого принудительно устанавливают набор отдельных вызовов Add.Вы заканчиваете тем, что пишете этот метод снова и снова.

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

2 голосов
/ 21 октября 2010

Нет, не лучше. Поддержка синтаксиса инициализации коллекции любой класс, который: 1) имеет Add метод 2) реализует IEnumerable. Таким образом, он работает с каждой коллекцией, даже с Dictionary, а не только с List. Кроме того, ваш метод требует создания массива, небольших, но чрезмерных накладных расходов. Инициализация не имеет.

...