C#列表定义,括号与花括号

时间:2016-09-17 15:19:51

标签: c# list

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

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

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

4 个答案:

答案 0 :(得分:29)

花括号{ }的使用称为集合初始值设定项。对于实现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" }, ... };

答案 1 :(得分:4)

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

答案 2 :(得分:3)

他们有不同的语义。

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

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

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

上面的行使用{}中显示的元素初始化一个新的字符串列表。因此,如果您执行了List<string> myList2 = new List<string>{"elem1", "elem2"};,那么您将定义一个包含2个元素的新列表。由于您在{}中未定义任何元素,因此会创建一个空列表。

但为什么第二行没有()

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

答案 3 :(得分:0)

简短 - 创建的对象没有区别。

但还有更多: 您提出的问题不是List具体问题 - 这是objectCollection初始化的问题。

请参阅here