先来看IEnumerable,接口只有一个函数GetEnumerator().
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
再来看IEnumerator,有moveNext()和Reset()函数,还有只读的current.
public interface IEnumerator
{
bool MoveNext();
object Current { get; }
void Reset();
}
yield只能使用在返回类型必须为 IEnumerable、IEnumerable、IEnumerator 或 IEnumerator的方法、运算符、get访问器中。
//如果我们要实现使用迭代器访问对象。
public class IEnumTest : IEnumerable
{
public IEnumerator GetEnumerator()
{
yield return 6;
yield return 5;
}
}
IEnumTest tt = new IEnumTest();
foreach (var t in tt)
{
Debug.Log(t);
}
或者这么写
public class IEnumTest : IEnumerable
{
public IEnumerable GetEnumerable()
{
yield return 1;
yield return 2;
}
}
IEnumTest tt = new IEnumTest();
foreach (var t in tt.GetEnumerable())
{
Debug.Log(t);
}
这里我们没有去实现IEnumator,却还是能通过迭代器访问数据,说明yield还是给我们去做了这些事情,通过反编译代码我们就能看到那些自动生成的代码。具体看这篇文章:https://www.cnblogs.com/blueberryzzz/p/8678700.html
看了个之前没明白的东西。foreach会造成gc的问题。这个问题在unity5.6修复了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200427151909439.png)
这个是List文件中的Enumerator,可以看到是一个结构体。
在之前foreach完会调用dispose,但在调用之前将返回的这个Enumator装箱,所以就出现了gc.