所有 IEnumerator<T> 本質為狀態機。ArrayEnumerator 以 m_index 追蹤位置,MoveNext 遞減索引,Current 回傳當前項目。程式碼枯燥且易錯,鏈結清單/樹狀結構更複雜。
直接用 foreach (int num in new ArrayEnumerator<int>(numbers)) 無法編譯。須再定義 ArrayEnumerable<T> : IEnumerable<T> 回傳 Enumerator。
單一成員即可取代上述兩個類別:
private static IEnumerable<T> ArrayIterator<T>(T[] array) {
for (int index = array.Length - 1; index >= 0; index--)
yield return array[index];
}
呼叫:foreach (int item in ArrayIterator(numbers))。泛型方法配合型別推論,連 <Int32> 都可省略。
IEnumerable<T> → 產生實作 IEnumerable<T>, IEnumerable, IEnumerator<T>, IEnumerator, IDisposable。IEnumerator<T> → 僅產生 IEnumerator<T>, IEnumerator, IDisposable。IEnumerable<Object>/IEnumerator<Object>。yield return:回傳值並**暫停**執行,下次 MoveNext 從下一行繼續。yield break:讓 MoveNext 回傳 false,強制結束 foreach。MoveNext 回傳 false。try/catch/finally, lock, using, 迴圈等結構,編譯器自動重寫保持語意。out/ref 參數。return 陳述式(只能 yield return)。