集合初始化语法,用于什么?

时间:2010-10-21 16:49:42

标签: c# language-agnostic programming-languages language-features language-design

我们可以使用像

这样的功能
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 个答案:

答案 0 :(得分:8)

这需要在您的类型中添加新功能。集合初始化程序不需要任何外部代码即可工作 - 您可以将它们用于任何兼容的集合类型,并由编译器自动处理。

此外,使用语言功能而不是滚动自己的方法将使代码对其他开发人员更加明显。由于您使用的是标准语言功能,因此意图变得明显。使用扩展方法很容易掩盖你的意图。

  

那么,当我们真的需要使用它时呢?

您永远不会需要来使用它。与所有语言功能一样,它是一种工具 - 您可以选择使用或忽略,作为开发人员自行决定。

答案 1 :(得分:7)

您的示例的一个问题是它比集合初始化程序语句的效率低得多。 params的使用迫使集合基本上被创建两次

  1. 为值
  2. 创建.Net数组
  3. 创建实际集合
  4. 另一方面,集合初始化器只是创建第二个集合。

    总的来说,虽然收集初始化程序的一个主要原因是不必编写此API。框架中有各种各样的集合,其中包含各种不同的创建模式。许多人没有构造函数使用IEnumerable而是强制执行一组单独的Add调用。你最后一遍又一遍地写这个方法。

    集合初始值设定项可让您完全避免使用它,而只需使用开箱即用的集合。

答案 2 :(得分:2)

不,这不是更好。集合初始化语法支持任何类:1)具有Add方法2)实现IEnumerable。因此,它适用于每个集合,即使只有Dictionary,而不是List。另外,您的方法需要创建数组,但开销很小但是过多。初始化没有它。