中断和收益率突破之间的差异
使用 yield break
而不是 break
可能并不像人们想象的那么明显。互联网上有很多不好的例子,两者的使用是可以互换的,并没有真正证明它们的区别。
令人困惑的部分是两个关键词(或关键短语)只在循环中有意义(foreach
,while
……)那么何时选择一个而不是另一个?
重要的是要意识到,一旦在方法中使用 yield
关键字,就可以有效地将方法转换为迭代器 。这种方法的唯一目的是迭代有限或无限集合并产生(输出)其元素。一旦达到目的,就没有理由继续执行方法。有时,它会自动发生在方法 }
的最后一个右括号中。但有时候,你想过早地结束这个方法。在普通(非迭代)方法中,你将使用 return
关键字。但你不能在迭代器中使用 return
,你必须使用 yield break
。换句话说,对于标准方法,迭代器的 yield break
与 return
相同。然而, break
语句只是终止最接近的循环。
我们来看一些例子:
/// <summary>
/// Yields numbers from 0 to 9
/// </summary>
/// <returns>{0,1,2,3,4,5,6,7,8,9}</returns>
public static IEnumerable<int> YieldBreak()
{
for (int i = 0; ; i++)
{
if (i < 10)
{
// Yields a number
yield return i;
}
else
{
// Indicates that the iteration has ended, everything
// from this line on will be ignored
yield break;
}
}
yield return 10; // This will never get executed
}
/// <summary>
/// Yields numbers from 0 to 10
/// </summary>
/// <returns>{0,1,2,3,4,5,6,7,8,9,10}</returns>
public static IEnumerable<int> Break()
{
for (int i = 0; ; i++)
{
if (i < 10)
{
// Yields a number
yield return i;
}
else
{
// Terminates just the loop
break;
}
}
// Execution continues
yield return 10;
}