当前位置: 首页 > 编程语言 > C#

“foreach”循环背后发生了什么?分享

时间:2023-04-10 23:38:35 C#

“foreach”循环背后发生了什么?可能重复:foreach循环在C#中如何工作?我一直在网上搜索,但很难找到有关C#中foreach循环幕后真正发生的事情的任何答案。我知道这个问题与实际编码无关,但它困扰着我。我对OO编程非常陌生,尤其是接口。我知道它们是合同,并且我了解IEnumerable和IEnumerator是如何工作的——至少我是这么认为的。我一直在阅读MSDN上的这篇文章:IEnumerableInterface,我了解一切是如何构建的。我有点不清楚foreach如何知道如何在主循环中遍历_people中的所有值。你怎么会知道这事?它如何跟踪CurrentreturnnewPeopleEnum(_people);通过调用returnnewPeopleEnum(_people);?编辑:我不知道这是一个完全相同的副本。是的,出于类似的原因,提出了同样的问题,但我们正在寻找不同的答案,或者我想要的答案在上一个问题中没有讨论。像foreach(intiinobj){...}等的foreach循环等同于...“有点”不是我正在寻找的答案。我鼓励您阅读C#规范的第8.8.4节,它详细回答了您的问题。为方便起见,在此处引用:foreach(Vvinx)embedded-statement形式的foreach语句,然后扩展为:{Ee=((C)(x)).GetEnumerator();试试{Vv;while(e.MoveNext()){v=(V)(T)e.Current;embedded-statement}}finally{codetoDisposeeifnecessary}}E、C、V和T类型由语义分析器推导出枚举器、集合、循环变量和集合元素类型;有关详细信息,请参阅规范。“foreach”只是一种更方便的编写“while”循环的方法,该循环调用MoveNext直到MoveNext返回false。一些微妙的事情:考虑一下:varenumerator=.GetEnumerator();while(enumerator.MoveNext())所以当它调用GetEnumerator时,你的PeopleEnum结果返回给PeopleEnum。每次MoveNext方法将PeopleEnum位置递增1时,就会遍历列表。当位置到达末尾时,MoveNext调用返回false,循环结束。它知道迭代IEnumerable,因为这是语言设计者决定foreach应该做的。foreach为您提供了一种自行遍历IEnumerable的简写方法。IEnumerator类定义了“获取下一个元素”的含义。如果需要,您可以让IEnumerator返回所有其他元素,但大多数人只想按顺序迭代每个元素。我不确定我是否回答了你的问题。如果没有,请告诉我,我会回复。以上就是C#学习教程:“foreach”循环背后发生了什么?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: