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

[amazonjs asin=”B01N7C4P8N” locale=”JP” title=”Effective C# (Covers C# 6.0), (includes Content Update Program): 50 Specific Ways to Improve Your C# (Effective Software Development Series)”]

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

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です