以下のコードで、sequence()
デリゲートはindex変数をキャプチャしている。
public static void Main(string[] args)
{
var index = 0;
Func<IEnumerable<int>> sequence =
() => Generate(30, () => index++);
index = 20;
foreach (int n in sequence())
WriteLine(n);
WriteLine("Done");
index = 100;
foreach (var n in sequence())
WriteLine(n);
}
public static IEnumerable<int> Generate(int n, Func<int> func)
{
for (var i = 0; i < n; i++)
yield return func();
}
バインドされた変数を書き換えると、遅延実行との関係で予期せぬエラーを生むことがある。クロージャーにバインドされた変数の書き換えは避けるべきである。