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";