C#迭代器(IEnumerator)与Unity协程(Coroutine)

C#迭代器(IEnumerator)与Unity3D协程(Coroutine)


引言:


使用Unity3D避免不了使用协程(Coroutine),他提供了另一种流程控制的方法,但是如果了解不够深入,会造成不知道什么时候代码会被执行,从而产生不可预知的错误。这篇文章尽可能用通俗的语言和例子解释迭代器和协程的由来和工作原理,本人能力有限,不对之处敬请指正。


.C#篇:


1.基础迭代器(IEnumerator)


迭代器是一个普通的接口类,如果写C++代码的话感觉更接近"iterator",这个概念,微软C#官方文档在介绍迭代器时用的也是"iterator"这个词,基础迭代器是为了实现类似for循环对指定数组或者对象的子元素逐个的访问而产生的。


public interface IEnumerator
{

object Current { get; }
bool MoveNext();
void Reset();

}

以上是IEnumerator的定义。


Current()方法的实现应该是返回调用者需要的指定类型的指定对象。


MoveNext()(方法的实现应该是让迭代器前进。


Reset()方法的实现应该是让迭代器重置未开始位置。


注意以上用的都是“应该是”,也就是说写程序的时候我们可以任意实现一个派生自” IEnumerator”类的3个函数的功能,但是如果不按设定的功能去写,可能会造成被调用过程出错,无限循环等问题


例如我们要遍历打印一个字符串数组


public string[] m_StrArray = new string[4];


就可以派生一个迭代器接口的子类


public class StringPrintEnumerator : IEnumerator

{

   private int m_CurPt = -1;

   private string[] m_StrArray;

   public StringPrintEnumerator(string[] StrArray)

   {

       m_StrArray = StrArray;

   }

   public object Current

   {

       get

       {

           return m_StrArray[m_CurPt];

       }

   }

   public void Reset()

   {

       m_CurPt = -1;

   }

   public bool MoveNext()

   {

       m_CurPt++;

       if (m_CurPt == m_StrArray.Length)

           return false;

       return true;

   }

}


以下是具体打印的过程


public static void Do()

{

       string[] StrArray = new string[4];

       StrArray[0] = "A";

       StrArray[1] = "B";

  • 18
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值