Я не согласен с Дарином: они не эквивалентны с точки зрения производительности. Последняя версия должна создать новый массив, и ToList
скопирует его в новый список. Версия инициализатора коллекции эквивалентна:
var tmp = new List<int>();
tmp.Add(1);
tmp.Add(2);
tmp.Add(3);
var ints = tmp;
Предполагается, что список начинается с достаточно большого буфера, который не потребует дальнейшего выделения - хотя будет включать несколько вызовов методов. Если вы сделаете это для очень большого количества элементов, то для него потребуется больше выделений, чем для ToList
версии, потому что он будет копировать элементы по ходу.
Разница в производительности равна , вероятно, будет незначительной, но она не равна нулю (и не явно лучше в любом направлении - в версии массива меньше вызовов, но больше выделения ).
Я бы сконцентрировался больше на стиле, чем на производительности, если у вас нет причин подозревать, что разница значительна, и в этом случае вам следует измерить , а не просто гадать.
Лично я предпочитаю первую форму - я думаю, она проясняет, что вы используете список с самого начала. Другой вариант - написать собственный статический класс:
public static class Lists
{
public static List<T> Of<T>(T item0)
{
return new List<T> { item0 };
}
public static List<T> Of<T>(T item0, T item1)
{
return new List<T> { item0, item1 };
}
public static List<T> Of<T>(T item0, T item1, T item2)
{
return new List<T> { item0, item1, item2 };
}
... as many times as you really care about, then ...
public static List<T> Of<T>(params T[] items)
{
return items.ToList();
}
}
Тогда вы можете написать:
var ints = Lists.Of(1);
var ints = Lists.Of(1, 2, 3);
var ints = Lists.Of(1, 2, 3, 5, 6, 7, 8); // Use the params version
Это все еще дает понять, что вы используете списки, но использует преимущества вывода типов.
Вы можете считать это излишним:)