我刚刚注意到,当您在c#中声明List
时,您可以在最后添加括号或花括号。
List<string> myList = new List<string>();
List<string> myList2 = new List<string>{};
这两个列表似乎都具有相同的功能。用括号或花括号声明它们是否有任何实际差异?
答案 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};
在初始化对象时,这在许多地方都很有用。
答案 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)