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

Mik*_*ica 23 c# list

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

List<string> myList = new List<string>();
List<string> myList2 = new List<string>{};
Run Code Online (Sandbox Code Playgroud)

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

Bis*_*its 31

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

List<string> myList2 = new List<string>() { "one", "two", "three" };
Run Code Online (Sandbox Code Playgroud)

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

List<string> myList2 = new List<string>() { };
Run Code Online (Sandbox Code Playgroud)

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

List<string> myList2 = new List<string> { };
Run Code Online (Sandbox Code Playgroud)

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

var person = new Person
                 {
                     Name = "Alice",
                     Age = 25
                 };
Run Code Online (Sandbox Code Playgroud)

可以将这些结合起来:

var people = new List<Person>
                 {
                     new Person
                         {
                             Name = "Alice",
                             Age = 25
                         },
                     new Person
                         {
                             Name = "Bob"
                         }
                 };
Run Code Online (Sandbox Code Playgroud)

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

var person = new { Name = "Alice" };
Run Code Online (Sandbox Code Playgroud)

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

var myArray = new [] { "one", "two", "three" };
Run Code Online (Sandbox Code Playgroud)

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

var myArray = new string [,] { { "a1", "b1" }, { "a2", "b2" }, ... };
Run Code Online (Sandbox Code Playgroud)

  • 不,我的意思是实现IEnumerable的类.集合初始化程序将在正常重载解析后查找"Add"方法.另请参阅[此答案](http://stackoverflow.com/a/2495801/2707705). (2认同)

Dar*_*ung 5

第一个版本初始化一个空列表。第二个版本用于用值初始化列表。如果没有至少一个T.

所以你可以这样做:

List<string> Foo = new List<string>{"foo", "bar"};
Run Code Online (Sandbox Code Playgroud)

或者

List<T> Foo = new List<T>{SomeInstancesOfT};
Run Code Online (Sandbox Code Playgroud)

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

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


raf*_*elc 5

它们有不同的语义。

List<string> myList = new List<string>();
Run Code Online (Sandbox Code Playgroud)

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

List<string> myList2 = new List<string>{};
Run Code Online (Sandbox Code Playgroud)

上面的行初始化一个新的字符串列表,其中包含{}. 所以,如果你这样做了,List<string> myList2 = new List<string>{"elem1", "elem2"};你就是在定义一个包含 2 个元素的新列表。由于您没有在 中定义任何元素{},它将创建一个空列表。

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

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