Yield的工作流程

  • 在第一次调用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();
}

posted @ 2019-11-21 10:28  wesson2019  阅读(125)  评论(0)    收藏  举报