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 時,自動產生 IEnumerator 或 IEnumerator<T> 介面的 Current、MoveNext 和 Dispose 方法。
Iterator 概觀
Iterator 是程式碼區段,會傳回相同型別之按順序排列的值。
Iterator 可以當做方法主體、運算子或 get 存取子使用。
Iterator 程式碼會使用 yield return 陳述式輪流傳回各元素。yield break 則會結束反覆運算。
可在類別上實作多個 Iterator。每個 Iterator 必須像任何類別成員一樣擁有唯一名稱,且可以由 foreach 陳述式中的用戶端程式碼叫用,如下所示:foreach(int x in SampleClass.Iterator2){}。
Iterator 的傳回型別必須是 IEnumerable、IEnumerator、IEnumerable<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