中斷和收益率突破之間的差異

使用 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;
    }