在C#中初始化一个Generic.List

在C#中,我可以使用以下语法初始化一个列表。

List<int> intList= new List<int>() { 1, 2, 3 }; 

我想知道这个{}语法是如何工作的,如果它有一个名字。 有一个构造函数需要IEnumerable ,你可以调用它。

 List<int> intList= new List<int>(new int[]{ 1, 2, 3 }); 

这似乎更“标准”。 当我解构List的默认构造函数时,我只能看到

 this._items = Array.Empty; 

我希望能够做到这一点。

 CustomClass abc = new CustomClass() {1, 2, 3}; 

并能够使用1, 2, 3列表。 这个怎么用?

更新

Jon Skeet回答

它调用无参数的构造函数,然后调用Add:

 > List<int> tmp = new List<int>(); > tmp.Add(1); tmp.Add(2); tmp.Add(3); > List<int> intList = tmp; 

我明白是什么 我想知道如何。 这个语法如何知道调用Add方法?

更新

我知道,接受Jon Skeet的答案是多么的老套。 但是,string和整数的例子非常棒。 另外一个非常有用的MSDN页面是:

  • 对象和集合初始化器(C#编程指南)

这被称为集合初始值设定项 。 它调用无参数的构造函数,然后调用Add:

 List<int> tmp = new List<int>(); tmp.Add(1); tmp.Add(2); tmp.Add(3); List<int> intList = tmp; 

该types的要求是:

  • 它实现了IEnumerable
  • 它具有适用于您提供的参数types的Add重载。 您可以在大括号中提供多个参数,在这种情况下,编译器会查找具有多个参数的Add方法。

例如:

 public class DummyCollection : IEnumerable { IEnumerator IEnumerable.GetEnumerator() { throw new InvalidOperationException("Not a real collection!"); } public void Add(string x) { Console.WriteLine("Called Add(string)"); } public void Add(int x, int y) { Console.WriteLine("Called Add(int, int)"); } } 

然后你可以使用:

 DummyCollection foo = new DummyCollection { "Hi", "There", { 1, 2 } }; 

(当然,通常你会希望你的集合正确地实现IEnumerable …)

读取对象和集合初始化器(C#编程指南) 。 基本上你可以用每个自定义types都是列表(实现IEnumerable)。

他们被称为集合初始化器 (也见这里 ),他们的工作方式是通过寻找一个可以进行出价的Add()方法。 它调用你的花括号中的每个整数的Add()

Add()方法的search是纯粹的编译器魔术。 这是硬编码find这个名字的方法。

你喜欢的名字是“Collection Initializer”。 它通过在集合types中查找一个名为Add的方法,并为每个指定的值调用它。

更多细节: 对象和集合初始化器(C#编程指南)

我相信这是一个.Add方法的快捷方式。 但是,我从来没有试图覆盖它,所以我不知道是否有可能。

它实际上使用.Add方法。 这意味着它正在调用。为构造函数中的括号中的每个项目添加。

就我而言,通过对象初始化添加项目search方法添加。 所以,List <int>将会有void Add(int),它将会起作用。

要在课堂上使用它,只需添加

 class CustomClass { public void Add(int num) { // Your code here } } 

Hallgrim指出,你的课应该实现IEnumerable。