中斷和收益率突破之間的差異
使用 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;
}