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

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

 List myList = new List(); List myList2 = new List{}; 

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

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

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

允许使用空集合初始值设定项:

 List myList2 = new List() { }; 

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

 List myList2 = new List { }; 

您可以为类属性执行类似的操作,但之后将其称为对象初始值设定项

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

可以将这些结合起来:

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

C#3.0中引入的这种语言function还支持初始化匿名类型 ,这在LINQ查询表达式中特别有用:

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

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

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

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

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

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

所以你可以这样做:

 List Foo = new List{"foo", "bar"}; 

要么

 List Foo = new List{SomeInstancesOfT}; 

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

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

它们有不同的语义。

 List myList = new List(); 

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

 List myList2 = new List{}; 

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

但为什么第二行没有()

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

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

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

看到这里 。