中断和收益率突破之间的差异

使用 yield break 而不是 break 可能并不像人们想象的那么明显。互联网上有很多不好的例子,两者的使用是可以互换的,并没有真正证明它们的区别。

令人困惑的部分是两个关键词(或关键短语)只在循环中有意义(foreachwhile ……)那么何时选择一个而不是另一个?

重要的是要意识到,一旦在方法中使用 yield 关键字,就可以有效地将方法转换为迭代器 。这种方法的唯一目的是迭代有限或无限集合并产生(输出)其元素。一旦达到目的,就没有理由继续执行方法。有时,它会自动发生在方法 } 的最后一个右括号中。但有时候,你想过早地结束这个方法。在普通(非迭代)方法中,你将使用 return关键字。但你不能在迭代器中使用 return,你必须使用 yield break。换句话说,对于标准方法,迭代器的 yield breakreturn 相同。然而, 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;
    }