normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

ラムダ式での上位スコープの保存

ちょっと下記で書いてる「究極のC#プログラミング」本で、ラムダ式の上位スコープ保存っぷりを書いてあったので写経。

class Program
{
    public static void Main(string[] args)
    {
        Console.WriteLine("-------- 上位スコープ保存1 ------------");
        IList<Action> list1 = new List<Action>();
        for (int i = 0; i < 3; i++)
        {
            list1.Add(() => Console.WriteLine(i));
        }
        foreach (var func in list1)
        {
            func();
        }
        //3
        //3
        //3

        Console.WriteLine("-------- 上位スコープ保存2 ------------");
        IList<Action> list2 = new List<Action>();
        for (int i = 0; i < 3; i++)
        {
            int j = i;
            list2.Add(() => Console.WriteLine(j));
        }
        foreach (var func in list2)
        {
            func();
        }
        //0
        //1
        //2
        Console.ReadLine();
    }
}

サンプルを見てわかる事は、「上位スコープの保存はされてるけど、メソッド実行時に参照した値」が帰ってくるってことでしょか?直感的にはラムダ式作成時のスコープでの変数値が保存されそうですが…。うーん、これは知っておかないと妙なところではまりそうだ。

[完全版] 究極のC#プログラミング ~新スタイルによる実践的コーディング

[完全版] 究極のC#プログラミング ~新スタイルによる実践的コーディング