Share via


Iterator (C# 程式設計手冊)

更新:2007 年 11 月

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# 語言規格中的下列章節:

  • 10.14 Iterator

請參閱

概念

C# 程式設計手冊

參考

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