- 在第一次调用MoveNext之前,CreateEnumerable中的代码不会被调用
- 所有工作在调用MoveNext时就完成了,获取Current的值不会执行任何代码
- 在yield return的位置,代码会停止执行,方法暂时返回调用者方法,在下一次执行MoveNext时有继续在下一行代码继续执行
- 在一个方法中的不同位置可以编写多个yield return语句
- 代码不会在最后的yield return处结束而是通过返回false的MoveNext调用来结束方法的执行
private static readonly string _Padding = new string(' ', 30);
private static IEnumerable<int> CreateEnumerable()
{
Console.WriteLine("{0}Start of CreateEnumerable()", _Padding);
for (int i = 0; i < 3; i++)
{
Console.WriteLine("{0}About to yield {1}", _Padding, i);
yield return i;
Console.WriteLine("{0}After yield", _Padding);
}
Console.WriteLine("{0}Yielding final value", _Padding);
yield return -1;
Console.WriteLine("{0}End of CreateEnumerable()", _Padding);
}
static void Main(string[] args)
{
IEnumerable<int> iterable = CreateEnumerable();
IEnumerator<int> iterator = iterable.GetEnumerator();
Console.WriteLine("Starting to iterate");
while (true)
{
Console.WriteLine("Calling MoveNext()......");
bool result = iterator.MoveNext();
if (!result)
{
break;
}
Console.WriteLine("Fetching Current...");
Console.WriteLine("...Current result={0}", iterator.Current);
}
Console.ReadKey();
}
