惰性評估示例 Fibonacci 數
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics; // also add reference to System.Numberics
namespace ConsoleApplication33
{
    class Program
    {
        private static IEnumerable<BigInteger> Fibonacci()
        {
            BigInteger prev = 0;
            BigInteger current = 1;
            while (true)
            {
                yield return current;
                var next = prev + current;
                prev = current;
                current = next;
            }
        }
        static void Main()
        {
            // print Fibonacci numbers from 10001 to 10010
            var numbers = Fibonacci().Skip(10000).Take(10).ToArray();
            Console.WriteLine(string.Join(Environment.NewLine, numbers));
        }
    }
}
它是如何工作的(我建議在 IL Disaambler 工具中反編譯生成的 .exe 檔案):
- C#編譯器生成一個實現 
IEnumerable<BigInteger>和IEnumerator<BigInteger>的類(ildasm 中的<Fibonacci>d__0)。 - 該類實現了一個狀態機。狀態由方法中的當前位置和區域性變數的值組成。
 - 最有趣的程式碼是 
bool IEnumerator.MoveNext()方法。基本上,MoveNext()做什麼:- 恢復當前狀態。像 
prev和current這樣的變數成為了我們類的領域(ildasm 中的<current>5__2和<prev>5__1)。在我們的方法中,我們有兩個位置(<>1__state):首先在開口大括號,第二個在yield return。 - 執行程式碼直到下一個 
yield return或yield break/}。 - 對於 
yield return,結果值被儲存,因此Current屬性可以返回它。true被退回。此時,為下一次MoveNext呼叫再次儲存當前狀態。 - 對於 
yield break/}方法,只返回false意味著迭代完成。 
 - 恢復當前狀態。像 
 
另請注意,第 10001 個數字長度為 468 個位元組。狀態機僅將 current 和 prev 變數儲存為欄位。如果我們想要儲存序列中從第一個到第 10000 個的所有數字,則消耗的記憶體大小將超過 4 兆位元組。因此,如果使用得當,延遲評估可以減少某些情況下的記憶體佔用。