在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。