究竟是怎样的foreach
在 C# 中实现?
我想象它的一部分看起来像:
var enumerator = TInput.GetEnumerator();
while(enumerator.MoveNext())
{
// do some stuff here
}
但我不确定到底发生了什么。使用什么方法返回enumerator.Current
每个周期?它是否返回[每个周期]或者是否需要一个匿名函数或其他东西来执行主体foreach
?
它不使用匿名函数,不。基本上编译器将代码转换成某种东西大致等同到您在此处显示的 while 循环。
foreach
isn't函数调用 - 它内置于语言本身中,就像for
循环和while
循环。它不需要返回任何内容或“获取”任何类型的函数。
注意foreach
有一些有趣的皱纹:
- 当迭代数组(在编译时已知)时,编译器可以使用循环计数器并与数组的长度进行比较,而不是使用
IEnumerator
-
foreach
将在最后处理迭代器;这很简单IEnumerator<T>
这延伸了IDisposable
,但作为IEnumerator
doesn't,编译器在执行时插入一个检查来测试迭代器是否实现IDisposable
- 您可以迭代未实现的类型
IEnumerable
or IEnumerable<T>
,只要您有适用的GetEnumerator()
返回具有合适类型的方法Current
and MoveNext()
成员。正如评论中所指出的,类型可以also实施IEnumerable
or IEnumerable<T>
明确地,但有一个公共GetEnumerator()
返回除以下类型之外的类型的方法IEnumerator
/IEnumerator<T>
. See List<T>.GetEnumerator() http://msdn.microsoft.com/en-us/library/b0yss765.aspx例如 - 这可以避免在许多情况下创建不必要的引用类型对象。
有关详细信息,请参阅 C# 4 规范的第 8.8.4 节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)