列表中枚举数上的公共访问修饰符的原因是什么?
我期望私人修饰语而不是公共修饰语。
列表源代码
发布于 2016-03-11 11:56:39
它是公开的,因此可以声明GetEnumerator()方法来返回它。
然后允许C#编译器在foreach循环中使用它..。避免任何堆分配,因为是一个结构。(一个可变的结构,这让我不得不说“啊!”但这是另一个故事。
所以当你有这样的事情时:
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()在List<T>中的实现返回一个装箱的List<string>.Enumerator。
发布于 2016-03-11 11:56:14
仅仅是因为它在许多其他组件中被重用。
您可以讨论这是否是使用结构的有效理由,而不是底层接口,但这是我猜的最重要的原因。
https://stackoverflow.com/questions/35939570
复制相似问题