这三种在C#中创建新的List 的方法有何不同?

这三种在C#中创建新的List有何不同?

 A = new List(); B = new List { }; C = new List() { }; 

那些是等价的,所有三个都创建一个空的List

  1. 是一个简单的无参数构造函数
  2. 使用集合初始化语法,如果类提供无参数构造函数,则允许省略构造函数的大括号
  3. 与2.相同,只是提供可选的构造函数括号。

集合初始化语法允许您在构造对象时提供数据,

 List list = new List { "one", "two", "three" }; 

扩大到

 List list = new List(); list.Add("one"); list.Add("two"); list.Add("three"); 

由编译器。

没有区别,因为您在声明时没有初始化列表中的任何内容。

如果您在声明时添加一些字符串,则需要使用第二个或第三个选项:

 var B = new List { "some", "strings" }; var C = new List() { "some", "strings" }; 

如果要将值传递给List构造函数,则只需要第三个选项:

 var C = new List(5) { "some", "strings" }; 

要么

 var C = new List(5); // empty list but capacity initialized with 5. 

List类还有更多构造函数可用(例如,将现有集合或IEnumerable传递给List构造函数)。 有关详细信息,请参阅MSDN

这些都是相同的。 最终结果没有区别,只是在语法中。

在您的示例中,所有三个语句都是相同的:它们创建一个空字符串列表。 语句B和C可以将一些初始数据分配给列表,例如

 ingredients = new List { "Milk", "Sugar", "Flour" }; 

然后可以省略语句C中的()

{}用于collection \ object initilizer。
如果它仍然是空白,则不会做任何事情。

因此所有这些线都产生相同的东西。

在您给我们的示例中,结果将是相同的。

在性能方面,使用任何选项初始化空列表都不会有任何问题,因为生成的IL将包含ctor(),正如您可以使用IL DASM看到的那样。

如果要使用某些信息初始化列表,可以使用选项2或3。

 List b = new List { "abc", "abc" }; List c = new List() { "abc", "abc"}; 

在性能方面也是一样的,IL生成的将完全相同,包含ctor()和两个Add for both。

但你应该用最好的一个来阅读。 为了避免在为同事阅读代码时遇到任何问题,我会选择

  List a = new List(); 

但这是个人意见的问题。