Effective C# 3rd 読書メモ 44 バインドされた変数を書き換えてはいけない

以下のコードで、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();
}

バインドされた変数を書き換えると、遅延実行との関係で予期せぬエラーを生むことがある。クロージャーにバインドされた変数の書き換えは避けるべきである。

コメントを残す

コメントを残す