C# 入门(14) 枚举器(enumerator)和迭代器(iterator)

C#的枚举器和迭代器

参考书籍: 《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贤者模式
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值