一個泛型類作為Collection,可枚舉性(IEnumerable)是很重要的。正如C++的標準庫里的集合要有對應的迭代器(Iterator),這樣才能方便地foreach()等等。
泛型里的IEnumerable和IEnumerator:
1. 一個Collection要支持foreach方式的遍歷,必須實現(xiàn)IEnumerable接口(亦即,必須以某種方式返回IEnumerator對象)。
2. IEnumerator對象具體實現(xiàn)了iterator(通過MoveNext(),Reset(),Current)。
3. 從這兩個接口的用詞選擇上,也可以看出其不同:IEnumerable是一個聲明式的接口,聲明實現(xiàn)該接口的class是“可枚舉(enumerable)”的,但并沒有說明如何實現(xiàn)枚舉器(iterator);IEnumerator是一個實現(xiàn)式的接口,IEnumerator對象就是一個iterator(迭代器)。
4. IEnumerable和IEnumerator通過IEnumerable的GetEnumerator()方法建立了連接,可以通過IEnumerable的GetEnumerator()得到IEnumerator對象。(當前狀態(tài),遍歷,尾遞歸)
5. 由于IEnumerable擴展(繼承)了舊的IEnumerable接口,所以要實現(xiàn)兩個不同的方法:
IEnumerator GetEnumerator();
IEnumerator GetEnumerator(); // 由于和泛型版本的方法同名,所以該方法的實現(xiàn)需要使用顯式接口實現(xiàn)