为什么List <t>的枚举器是公开的?

时间:2016-03-11 11:51:35

标签: c# .net

列表中的枚举器上公共访问修饰符的原因是什么?

我希望私有修饰符代替公开。

List source code

2 个答案:

答案 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中被重复使用。

你可以讨论这是否是使用结构而不是底层接口的正当理由,但这是我猜的最重要的原因。