Iterator (C# 程式設計手冊)

Iterator 是一種方法、get 存取子 (Accessor),或是使用 yield 關鍵字對陣列或集合類別執行自訂反覆運算法的運算子。 yield 傳回陳述式 (Statement) 會使來源序列 (Sequence) 中的項目,在即將存取來源序列中的下一個項目時傳回到呼叫端。 雖然您可以將 Iterator 撰寫為方法,編譯器 (Compiler) 卻會將其轉譯為巢狀類別,也就是實際上的狀態機器。 只要用戶端程式碼上的 foreach 迴圈持續進行,這個類別就會持續追蹤 Iterator 的位置。

注意事項注意事項

若要查看編譯器在幕後進行的動作,請使用 ILDASM.exe 工具,檢視為 Iterator 方法產生的中繼語言 (IL) 程式碼。

Iterator 是使用 foreach 陳述式從用戶端程式碼叫用 (Invoke) 的。 例如,您建立的類別 Iterator 可以是以反向傳回項目,或是在該 Iterator 傳回每個項目之前對個別項目執行作業。 在為類別結構 (Struct) 建立 Iterator 時,您並不需要實作整個 IEnumerator 介面。 編譯器會在偵測到您的 Iterator 時,自動產生 IEnumeratorIEnumerator<T> 介面的 Current、MoveNext 和 Dispose 方法。

Iterator 概觀

  • Iterator 是程式碼區段,會傳回相同型別之按順序排列的值。

  • Iterator 可以當做方法主體、運算子或 get 存取子使用。

  • Iterator 程式碼會使用 yield return 陳述式依序傳回每個項目。 yield break 結束反覆運算。

  • 可在類別上實作多個 Iterator。 每個 Iterator 必須像任何類別成員一樣擁有唯一名稱,且可以由 foreach 陳述式中的用戶端程式碼叫用,如下所示:foreach(int x in SampleClass.Iterator2){}。

  • Iterator 的傳回型別必須是 IEnumerableIEnumeratorIEnumerable<T>IEnumerator<T>

  • Iterators 是 LINQ 查詢中延後執行行為的基礎。

yield 關鍵字會用來指定所傳回的單一個或多個值。 當到達 yield return 陳述式時,便會儲存目前的位置。 下一次呼叫此 Iterator 時,便會從這個位置重新開始執行。

Iterator 特別適合與集合類別搭配使用,因為能夠提供逐一查看像是二元樹等複雜資料結構的方法。

相關章節

如需詳細資訊,請參閱下列主題:

範例

在這個範例中,DaysOfTheWeek 類別是將一週中的每一天儲存為字串的簡單集合類別。 在 foreach 迴圈的每次反覆運算之後,都會傳回集合中的下一個字串。

public class DaysOfTheWeek : System.Collections.IEnumerable
{
    string[] days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };

    public System.Collections.IEnumerator GetEnumerator()
    {
        for (int i = 0; i < days.Length; i++)
        {
            yield return days[i];
        }
    }
}

class TestDaysOfTheWeek
{
    static void Main()
    {
        // Create an instance of the collection class
        DaysOfTheWeek week = new DaysOfTheWeek();

        // Iterate with foreach
        foreach (string day in week)
        {
            System.Console.Write(day + " ");
        }
    }
}
// Output: Sun Mon Tue Wed Thr Fri Sat

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格。 語言規格是 C# 語法和用法的決定性來源。

請參閱

參考

泛型 (C# 程式設計手冊)

概念

C# 程式設計手冊

其他資源

完整介紹 Iterator