【问题标题】:C# List definition, parentheses vs curly bracesC# 列表定义,括号与花括号
【发布时间】:2016-09-17 15:19:50
【问题描述】:

我刚刚注意到,当您在 c# 中声明 List 时,您可以在末尾添加括号或花括号。

List<string> myList = new List<string>();
List<string> myList2 = new List<string>{};

这两个列表似乎具有相同的功能。用括号或花括号声明它们是否有任何实际差异?

【问题讨论】:

  • 除了所有答案之外,为了清楚起见,请注意这两行将编译为相同的 IL,因此实际上没有功能差异。当您不需要集合初始化器(大括号)时,请使用第一个版本。
  • @PatriceGahide,很高兴知道它的编译方式相同。我问是否有一些细微的差异有一天可能会导致问题。

标签: c# list


【解决方案1】:

大括号{ } 的使用称为集合初始化器。对于实现IEnumerable 的类型,Add 方法将代表您正常调用:

List<string> myList2 = new List<string>() { "one", "two", "three" };

允许使用空集合初始化器:

List<string> myList2 = new List<string>() { };

并且,在实现初始化程序时,您可以省略默认构造函数的括号 ()

List<string> myList2 = new List<string> { };

你可以对类属性做类似的事情,但它被称为对象初始化器

var person = new Person
                 {
                     Name = "Alice",
                     Age = 25
                 };

并且可以将这些结合起来:

var people = new List<Person>
                 {
                     new Person
                         {
                             Name = "Alice",
                             Age = 25
                         },
                     new Person
                         {
                             Name = "Bob"
                         }
                 };

C# 3.0 中引入的这个语言特性还支持初始化anonymous types,这在 LINQ 查询表达式中特别有用:

var person = new { Name = "Alice" };

它们也适用于数组,但您可以进一步省略从第一个元素推断的类型:

var myArray = new [] { "one", "two", "three" };

初始化多维数组是这样的:

var myArray = new string [,] { { "a1", "b1" }, { "a2", "b2" }, ... };

更新

从 C# 6.0 开始,您还可以使用 索引初始化器。这是一个例子:

var myDictionary = new Dictionary<string, int>
                       {
                           ["one"] = 1,
                           ["two"] = 2,
                           ["three"] = 3
                       };

【讨论】:

  • 你的意思是ICollection,不是吗?您不能将 Add 项目添加到 IEnumerable
  • 不,我的意思是实现 IEnumerable 的类。集合初始化程序将在正常重载决议之后寻找Add 方法。另请参阅this answer
  • 总结:这只是一个语言特性;)。
  • 哇,不知道你可以这样省略数组构造函数!
  • 不使用 [] 作为数组的语法很奇怪。
【解决方案2】:

它们有不同的语义。

List<string> myList = new List<string>();

以上行初始化了一个新的字符串列表,() 是通过不带参数调用其构造函数来构建新对象的语法的一部分。

List<string> myList2 = new List<string>{};

上面的行用{} 中的元素初始化了一个新的字符串列表。因此,如果您执行了List&lt;string&gt; myList2 = new List&lt;string&gt;{"elem1", "elem2"};,您将定义一个包含 2 个元素的新列表。由于您在 {} 中没有定义任何元素,它将创建一个空列表。

但是为什么第二行没有()

这是讨论的一部分,在这种情况下省略括号表示对默认构造函数的调用。看看This Link

【讨论】:

    【解决方案3】:

    第一个版本初始化一个空列表。第二个版本用于用值初始化列表。如果没有至少一个T 实例,您不会或不应该看到使用的第二个版本。

    所以你可以这样做:

    List<string> Foo = new List<string>{"foo", "bar"};
    

    List<T> Foo = new List<T>{SomeInstancesOfT};
    

    这在初始化对象时在很多地方都很有用。

    https://msdn.microsoft.com/en-us/library/bb384062.aspx

    【讨论】:

      【解决方案4】:

      简而言之 - 创建的对象没有区别。

      但还有更多: 您要问的不是List 特定问题 - 这是objectCollection 初始化的问题。

      here

      【讨论】:

      • 为什么不在您的答案中总结该链接末尾的解释?为大家节省点击,避免链接失效问题,让您的回答更有用。
      猜你喜欢
      • 2018-05-02
      • 2014-02-16
      • 2019-01-26
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 2011-01-12
      相关资源
      最近更新 更多