C#的枚舉器和迭代器
參考書籍: 《C#圖解教程》
枚舉器一般用來foreach的,,而迭代器在Unity中常用來當(dāng)協(xié)程(Coroutine)用。
枚舉器
IEnumerator接口
實(shí)現(xiàn)IEnumerator接口的類就可以foreach了,,當(dāng)然前提是實(shí)現(xiàn)對,。這個接口有三個函數(shù)成員,。
- 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; //獲取當(dāng)前項
Console.WriteLine("{0}",i);
}
}
IEnumerable接口
只有一個成員,GetEnumerator方法,就是實(shí)現(xiàn)上面那個接口的類對象,。
應(yīng)該使用泛型枚舉接口
因?yàn)榉欠盒偷膶?shí)現(xiàn)是不安全的,,它們返回object的引用,需要自己轉(zhuǎn)換成實(shí)際類型,。如上面的代碼int i = (int) ie.Current; ,,是不安全的。而實(shí)現(xiàn)泛型的Current屬性,,就會返回實(shí)際類型的對象,。
迭代器
- yield return語句指定了序列中返回的下一項。
- yield break語句指定到序列中最尾端,,就是像真正的return一樣,。
常見迭代模式
迭代器實(shí)質(zhì)
狀態(tài) |
解釋 |
Before |
第一次迭代前 |
Running |
搞事情 |
Suspended |
等下一次迭代 |
After |
賢者模式 |
|