c#列表定义,圆括号vs大括号
本文关键字:vs 圆括号 列表 定义 | 更新日期: 2023-09-27 18:07:17
我刚刚注意到,当你在c#中声明一个List
时,你可以在末尾加上括号或大括号。
List<string> myList = new List<string>();
List<string> myList2 = new List<string>{};
这两个列表似乎具有相同的功能。用括号或花括号声明它们会有什么实际的区别吗?
使用花括号{ }
称为集合初始化式。对于实现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
特定的问题-这是object
和Collection
初始化的问题。
。