C# 入門(14) 列舉器(enumerator)和迭代器(iterator)
阿新 • • 發佈:2018-12-26
C#的列舉器和迭代器
列舉器一般用來foreach的,而迭代器在Unity中常用來當協程(Coroutine)用。
列舉器
IEnumerator介面
實現IEnumerator介面的類就可以foreach了,當然前提是實現對。這個介面有三個函式成員。
- Current
- 只讀。
- 返回object型別的引用。
- 第一次的位置在-1,所以算是溢位了。
- MoveNext
- 把列舉器位置指向下一項。
- 返回bool。判斷是否新的位置有效。
- 第一次用要在Current前。
- Reset
- 把位置重置到原始狀態。
foreach做的事跟下面這段程式碼差不多。
static void Main()
{
int[] MyArray = {10,11,12,13};
IEnumerator ie = MyArray.GetEnumerator(); //獲取列舉器
while(ie.MoveNext()) //移到下一項
{
int i =(int) ie.Current; //獲取當前項
Console.WriteLine("{0}",i);
}
}
IEnumerable介面
只有一個成員,GetEnumerator方法,就是實現上面那個介面的類物件。
應該使用泛型列舉介面
因為非泛型的實現是不安全的,它們返回object的引用,需要自己轉換成實際型別。如上面的程式碼int i = (int) ie.Current;
,是不安全的。而實現泛型的Current屬性,就會返回實際型別的物件。
迭代器
- yield return語句指定了序列中返回的下一項。
- yield break語句指定到序列中最尾端,就是像真正的return一樣。
常見迭代模式
迭代器實質
狀態 | 解釋 |
---|---|
Before | 第一次迭代前 |
Running | 搞事情 |
Suspended | 等下一次迭代 |
After | 賢者模式 |