おそらく、3年前にすでに語りつくされたネタだと思いますが…。
C#の匿名デリゲートは、ただの書式的な問題だけ、と思っていたのですが、
なぜローカル変数を引き継げるんですか!!
List<FUNC> func
for(int i = 0; i < 3; i++){
int a = 10;
func.Add(delegate(){Console.Writeline(a);});
}
foreach(var f in func) f();
これで、「10, 10, 10」と出力されます。(カンマは改行)
for(int i = 0; i < 3; i++){
int a = i;
func.Add(delegate(){Console.Writeline(a);});
}
foreach(var f in func) f();
こう書き換えれば、「0,1,2」 と出ますね。
for(int i = 0; i < 3; i++){
func.Add(delegate(){Console.Writeline(i);});
}
foreach(var f in func) f();
ですが、こう書き換えてしまうと…出力は「3,3,3」 です
ここで出力されるiはforでカウンタとして使っているiですから、
forを抜けた時はiは3のはずです。
そのiが出力されているんだからなんら不思議なことは…大有り過ぎる!!
C++なら間違いなく開放済みアドレスを指してますよ、これ!
なお、MSDNによると外部変数という扱いになり、開放済みアドレスを指すことはありません。
宣言時ではなく呼び出し時の値を参照することから、
実質引数が増えているのと変わらない使い方が出来て便利ですが、
今更ながらフリーダム過ぎる構文ではないかなぁと思います。