我刚刚注意到,当你List
在c#中声明一个时,你可以在最后添加括号或花括号.
List<string> myList = new List<string>();
List<string> myList2 = new List<string>{};
Run Code Online (Sandbox Code Playgroud)
这两个列表似乎都具有相同的功能.用括号或花括号声明它们是否有任何实际差异?
Bis*_*its 31
花括号的使用{ }
称为集合初始化程序.对于实现IEnumerable
该Add
方法的类型,将代表您正常调用:
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)
第一个版本初始化一个空列表。第二个版本用于用值初始化列表。如果没有至少一个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
它们有不同的语义。
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 个元素的新列表。由于您没有在 中定义任何元素{}
,它将创建一个空列表。
()
?这成为讨论的一部分,在这种情况下省略括号表示对默认构造函数的调用。看看这个链接