签出此程序:

static class Program
{
  static void Main()
  {
    GetLinks();
    Console.WriteLine("Program failed!");
  }

  static IEnumerable<string> GetLinks()
  {
    throw new Exception();
    foreach (var item in new string[] { })
      yield return item;
  }
}


这很奇怪,但是该程序的结果是Program failed!,这意味着甚至没有调用GetLinks函数。
对这种行为有何解释?

Check it out for yourself

最佳答案

迭代器块是惰性的。您需要通过在foreach中调用它来调用它。迭代器块中的代码仅在第一次调用MoveNext时执行,而foreach将为您执行。

到目前为止,您只是在准备查询,您需要先调用GetEnumerator,然后再调用MoveNext,以实现查询。

例如,以下代码将按预期失败。

static void Main()
{
    foreach(var item in GetLinks())
        Console.WriteLine(item );
    Console.WriteLine("Program failed!");
}


进一步阅读Iterator block implementation details

关于c# - 对于迭代器方法中的每个循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28108004/

10-09 01:08