签出此程序:
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/