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

dot*_*ter 1 c# language-agnostic language-features programming-languages language-design

我们可以使用像这样的功能

public static List<T> New<T>(params T[] items) {
    return new List<T>(items);
}
Run Code Online (Sandbox Code Playgroud)

更重要的是它更好

var list = new List<int> {1,2,3};
var list = List.New(1,2,3);
Run Code Online (Sandbox Code Playgroud)

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

字典

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");
Run Code Online (Sandbox Code Playgroud)

为什么它更好,键入推断

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));
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 8

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

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

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

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

  • 我相信惯用代码和质量之间存在很强的相关性. (2认同)

Jar*_*Par 7

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

  1. 一旦为值创建.Net数组
  2. 创建实际的集合

另一方面,集合初始化器只创建第二个集合.

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

集合初始化程序允许您完全避免编写它,而只是使用开箱即用的集合.

  • @ChaosPandion:有目的的过早去优化是所有愚蠢的根源. (5认同)