ちょっと下記で書いてる「究極の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#プログラミング ~新スタイルによる実践的コーディング
- 作者: 川俣晶
- 出版社/メーカー: 技術評論社
- 発売日: 2009/05/22
- メディア: 大型本
- 購入: 13人 クリック: 143回
- この商品を含むブログ (23件) を見る