Garbage Collection

塵も積もれば山

目次

Blog 利用状況

ニュース

C++とかC#とか数学ネタを投下していく予定です。

[その他のページ]
日々の四方山話を綴った日記出水の日記帳

書庫

日記カテゴリ

匿名デリゲート

おそらく、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によると外部変数という扱いになり、開放済みアドレスを指すことはありません。

宣言時ではなく呼び出し時の値を参照することから、

実質引数が増えているのと変わらない使い方が出来て便利ですが、

今更ながらフリーダム過ぎる構文ではないかなぁと思います。

投稿日時 : 2008年5月30日 3:12

Feedback

# re: 匿名デリゲート 2008/05/30 12:20 シャノン

こんなんありました。
http://ufcpp.net/study/csharp/sp2_anonymousmethod.html

# re: 匿名デリゲート 2008/05/30 13:23 出水

そこ、以前に宣言時の値が参照されるコードになっていて
突っ込んだのが私だったりする。

# re: 匿名デリゲート 2008/05/30 13:34 まさる

これがどうMSILに変換されるか、Insider.NETにAILightの菊池さんが書いた記事があったような。

あった、あった、これだ↓
http://www.atmarkit.co.jp/fdotnet/special/cs20review02/cs20review02_01.html

# C#Day 2008/08/10 16:01 Garbage Collection

C#Day

タイトル
名前
Url
コメント