2017年5月30日 星期二

[.Net/C#] foreach如何存取集合(Iterator/IEnumerable/IEnumerator/yield return)

說明:
foreach是用來對集合元素做巡覽/列舉的動作,透過Iterator來實作,
而Iterator是一種模式,在不暴露集合類別下,提供對集合類別依序巡覽的方法,
在.Net裡,已經將Iterator包好了,實作IEnumerable與IEnumerator即可。


什麼是IEnumerable?看下圖可知實作此介面提供一方法GetEnumerator(),
讓我們可以取得集合元素。



那IEnumerator呢? 提供實作iterator所需的方法與屬性。



也就是使用foreach in,編譯器會去找要巡覽的集合類別裡的GetEnumerator(),
然後執行IEnumerator內的MoveNext(),若回傳True,再取Current的值,
直到MoveNext回傳為False。


C# 1.0實作:
想巡覽Book集合類別,需實作IEnumerable與IEnumerator。







C# 2.0提供IEnumerable與IEnumerator的泛型,
可傳入巡覽元素的型別,減少裝箱與型別轉換的問題,
(因Current非泛型版本回傳值為object)。





C#2.0更提供yield return免除自己實作IEnumerator的困擾,
編譯器看到yield return會自動建立IEnumerator類別並回傳IEnumerator型別。



最後一樣可巡覽集合類別。