猿问

foreach循环如何在C#中工作?

foreach循环如何在C#中工作?

哪些类可以使用foreach循环?



温温酱
浏览 372回答 2
2回答

噜噜哒

实际上,严格来说,您需要使用的foreach只是一个使用方法和属性GetEnumerator()返回内容的公共方法。但是,最常见的含义是“实现/&nbsp;,返回/的东西”&nbsp;。bool MoveNext()? Current {get;}IEnumerableIEnumerable<T>IEnumeratorIEnumerator<T>通过暗示,这包括任何实现ICollection/&nbsp;ICollection<T>,如像什么Collection<T>,List<T>,阵列(T[])等。因此,任何标准的“数据集”将通常支持foreach。为了证明第一点,以下工作正常:using&nbsp;System;class&nbsp;Foo&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;Current&nbsp;{&nbsp;get;&nbsp;private&nbsp;set;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;step; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;bool&nbsp;MoveNext()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(step&nbsp;>=&nbsp;5)&nbsp;return&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Current&nbsp;=&nbsp;step++; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;}}class&nbsp;Bar&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Foo&nbsp;GetEnumerator()&nbsp;{&nbsp;return&nbsp;new&nbsp;Foo();&nbsp;}}static&nbsp;class&nbsp;Program&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;void&nbsp;Main()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bar&nbsp;bar&nbsp;=&nbsp;new&nbsp;Bar(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(int&nbsp;item&nbsp;in&nbsp;bar)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(item); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}它是如何工作的?像foreach(int i in obj) {...}有点类似的foreach循环等同于:var&nbsp;tmp&nbsp;=&nbsp;obj.GetEnumerator();int&nbsp;i;&nbsp;//&nbsp;up&nbsp;to&nbsp;C#&nbsp;4.0while(tmp.MoveNext())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i;&nbsp;//&nbsp;C#&nbsp;5.0 &nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;tmp.Current; &nbsp;&nbsp;&nbsp;&nbsp;{...}&nbsp;//&nbsp;your&nbsp;code}但是,有变化。例如,枚举器(tmp)支持IDisposable,它也被使用(类似于using)。注意循环中内部(C#5.0)与外部(上升C#4.0)的声明“&nbsp;int i”&nbsp;的位置不同。如果您在代码块中使用匿名方法/ lambda,这一点很重要。但那是另一个故事;-pi

ABOUTYOU

根据Duck Notation博客文章,使用鸭子打字。
随时随地看视频慕课网APP
我要回答