答案 0 :(得分:27)
它是公开的,因此GetEnumerator()
方法可以声明来返回它。
然后允许C#编译器在foreach
循环中使用它...避免任何堆分配因为List.Enumerator
是结构。 (一个可变的结构,这让我走了“urgh!”,但这是另一个故事。)
所以当你有类似的东西时:
List<string> list = new List<string> { "..." };
foreach (var item in list)
{
Console.WriteLine(item);
}
然后编译器可以将其转换为:
List<string> list = new List<string> { "..." };
using (List<string>.Enumerator enumerator = list.GetEnumerator())
{
while (enumerator.MoveNext())
{
string item = enumerator.Current;
Console.WriteLine(item);
}
}
请注意enumerator
的类型 - 如果我们有:
IEnumerable<string> list = new List<string> { "..." };
foreach (var item in list)
{
Console.WriteLine(item);
}
它会使用:
using (IEnumerator<string> enumerator = list.GetEnumerator())
...涉及堆分配,因为IEnumerator<string>
是引用类型。 IEnumerable<T>
中GetEnumerator()
的{{1}}实现会返回框 List<T>
。
答案 1 :(得分:1)
只是因为它在很多other assemblies中被重复使用。
你可以讨论这是否是使用结构而不是底层接口的正当理由,但这是我猜的最重要的原因。