首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

並發事件:透過 C# 簡化 APM (6) — 迭代器實作 IEnumerable/IEnumerator 與 yield return 進階

     編輯:關於C語言

手工實作 IEnumerator/IEnumerable 的繁瑣

所有 IEnumerator<T> 本質為狀態機。ArrayEnumerator 以 m_index 追蹤位置,MoveNext 遞減索引,Current 回傳當前項目。程式碼枯燥且易錯,鏈結清單/樹狀結構更複雜。

foreach 需要 IEnumerable,非 IEnumerator

直接用 foreach (int num in new ArrayEnumerator<int>(numbers)) 無法編譯。須再定義 ArrayEnumerable<T> : IEnumerable<T> 回傳 Enumerator。

C# 2.0 迭代器:yield return 簡化一切

單一成員即可取代上述兩個類別:


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 / yield break 語意

  • yield return:回傳值並**暫停**執行,下次 MoveNext 從下一行繼續。
  • yield break:讓 MoveNext 回傳 false,強制結束 foreach。
  • 自然結束方法同樣導致 MoveNext 回傳 false。

迭代器對非同步程式設計的三大助益

  1. 可在迭代器內存取參數/區域變數,編譯器自動封裝為類別欄位(如匿名方法/lambda)。
  2. 可撰寫循序代碼卻能中途暫停、稍後在不同執行緒繼續。
  3. 支援 try/catch/finally, lock, using, 迴圈等結構,編譯器自動重寫保持語意。

限制

  • 不可有 out/ref 參數。
  • 不可有 return 陳述式(只能 yield return)。
  • 不可包含 unsafe 代碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved