c#列表定义,圆括号vs大括号

本文关键字:vs 圆括号 列表 定义 | 更新日期: 2023-09-27 18:07:17

我刚刚注意到,当你在c#中声明一个List时,你可以在末尾加上括号或大括号。

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

这两个列表似乎具有相同的功能。用括号或花括号声明它们会有什么实际的区别吗?

c#列表定义,圆括号vs大括号

使用花括号{ }称为集合初始化式。对于实现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中引入的这个语言特性还支持初始化匿名类型,这在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
                       };

它们有不同的语义。

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

上面这行初始化了一个新的List of Strings, ()是通过调用不带参数的构造函数来构建新对象的语法的一部分。

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

上面这行用{}中的元素初始化了一个新的List of Strings。所以,如果你做了List<string> myList2 = new List<string>{"elem1", "elem2"};,你定义了一个有2个元素的新列表。由于您没有在{}中定义任何元素,因此它将创建一个空列表。

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

在这种情况下省略圆括号表示对默认构造函数的调用。看看这个链接

第一个版本初始化一个空列表。第二个版本用于用值初始化列表。如果没有至少一个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

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

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