static void Main(string[] args)
{
IEnumerator<int> iterator = GetIEnumerator();
Console.WriteLine("Start");
while(iterator.MoveNext())
{
Console.WriteLine(iterator.Current);
}
Console.WriteLine("end");
Console.ReadLine();
}
public static IEnumerator<int> GetIEnumerator()
{
try
{
Console.WriteLine("CreateIEnumerator");
for (int i = 1; i < 10; i++)
{
Console.WriteLine("about to yield " + i);
if (i >= 8)
{
yield break;
}
if (i >= 5)
{
yield return i * 2;
}
else
{
yield return i;
}
Console.WriteLine("after yield");
}
Console.WriteLine("end_iterator");
}
finally
{
Console.WriteLine("In Finally Stop");
}
}
结果:如下表
结论:1、在第一次调用MoveNext之前,GetIEnumerator中的代码不会执行
2、在第一次执行MoveNext时候,执行迭代器(GetIEnumerator)内部函数:代码段2
3、在执行MoveNext的时候
迭代器函数会运行,然后会在yield return 的时候跳出迭代器的运行,执行自己的业务代码:代码段1,等到下次执行MoveNext的时候,会从yield return 之后的代码:代码段4,开始运行
4、可以在迭代器方法内多个地方返回yield return语句
5、迭代器结束不是在最后的yield return调用时候结束的,而是在最后一次合法的yield return后,再次调用MoveNext的时候iterator.MoveNext()返回了false,此时再执行最后的Yield return后的代码
6、yield break 相当于普通方法中的return 语句,之后的代码不会执行
7、finally:迭代器中的try finally,只要离开迭代器作用域(迭代器终止运行),就一定会执行finally。
8、在MoveNext返回false的之后,itor.current值总是最后返回的生成的值
Start
CreateIEnumerator
about to yield 1
1
after yield
about to yield 2
2
after yield
about to yield 3
3
after yield
about to yield 4
4
after yield
about to yield 5
10
after yield
about to yield 6
12
after yield
about to yield 7
14
after yield
about to yield 8
In Finally Stop
end