在C#中,我可以使用以下语法初始化列表。
List<int> intList= new List<int>() { 1, 2, 3 };
我想知道{}
语法是如何工作的,以及它是否有名称。有一个接受IEnumerable
的构造函数,你可以调用它。
List<int> intList= new List<int>(new int[]{ 1, 2, 3 });
这看起来更“标准”。当我解构列表的默认构造函数时,我只看到
this._items = Array.Empty;
我希望能够做到这一点。
CustomClass abc = new CustomClass() {1, 2, 3};
并且能够使用1, 2, 3
列表。这是怎么回事?
更新
乔恩·斯基特回答
它正在调用无参数构造函数,然后调用
:
> List<int> tmp = new List<int>();
> tmp.Add(1); tmp.Add(2); tmp.Add(3);
> List<int> intList = tmp;
我明白这是怎么回事。我想知道是怎么回事。语法如何知道调用Add方法呢?
更新
我知道,接受乔恩·斯基特的回答是多么陈词滥调。但是,包含字符串和int的示例非常棒。还有一个非常有用的MSDN页面:
发布于 2009-04-15 14:36:33
这称为集合初始值设定项。它调用无参数构造函数,然后调用Add:
List<int> tmp = new List<int>();
tmp.Add(1);
tmp.Add(2);
tmp.Add(3);
List<int> intList = tmp;
该类型的要求为:
它实现了IEnumerable
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
...)
发布于 2009-04-15 14:36:42
阅读。基本上,您可以对每个自定义类型执行此操作,这些类型是一个列表(实现IEnumerable)。
发布于 2009-04-15 14:37:45
它们被称为collection initializers (也请参见here),它们的工作方式是通过寻找可以执行其指令的Add()
方法。它为花括号中的每个整数调用Add()
。
对Add()
方法的搜索是纯粹的编译器魔术。找到该名称的方法是硬编码的。
https://stackoverflow.com/questions/751990
复制相似问题