遍歷 0~19,輸出每個數,將大於 2 的數放入 IEnumerable<int> 回傳。
static IEnumerable WithoutYield()
{
var list = new List();
for (int i = 0; i < 20; i++)
{
Console.WriteLine(i);
if (i > 2) list.Add(i);
}
return list; // 完全在記憶體中
}
static IEnumerable WithYield()
{
for (int i = 0; i < 20; i++)
{
Console.WriteLine(i);
if (i > 2) yield return i; // 狀態機產生器
}
}
| 測試 | WithoutYield | WithYield |
|---|---|---|
| 直接呼叫不枚舉 | 輸出 0~19 (立即執行迴圈) | 無輸出 (未執行任何代碼) |
| foreach 枚舉 | 先輸出 0~19,再輸出 3~19 (兩次遍歷) | 交織輸出:0,1,2,3,3,4,4,5,5... (單次遍歷) |
MoveNext 時才執行到下一個 yield return,實現串流處理、無限序列、記憶體恆定。yield 是 C# 2.0 引入,LINQ to Objects 全賴此機制實現延遲查詢。