匿名メソッドって難しい
NyaRuRuさんのC#クイズを見て、そういえば前のクイズのほうもよくわからないまま放置してたなぁと思い出してしまいました。delegateまわりは推論があったり手厚いシンタックスシュガーがあったりレキシカルクロージャだったり共変と反変だのと、まぁとにかくお祭り騒ぎな機能ですよね。
using System; using System.Linq; using System.Threading; using System.Linq.Expressions; class Program { delegate void Func(); static void Main() { string s = "Hello "; Func f = () => { while ( true ) Console.Write( s ); }; f.BeginInvoke( null, null ); Thread.Sleep( 100 ); s = "World "; Thread.Sleep( 100 ); s = "!\n"; Thread.Sleep( 100 ); } }
↑EndInvoke呼んでなくてスミマセン。って謝るところはそこじゃないですね。
匿名メソッドはクロージャじゃないってタイトルで話題になった件ですが、日本でも海外でもたくさんの方が解説を書いていましたね。その件のスコープの問題とはちょっと違うけど、匿名メソッドがどう展開されるかの説明がわかりやすいのは超有名blogのこちら。
http://blogs.msdn.com/oldnewthing/archive/2006/08/02/686456.aspx
クロージャが何かってのは最近のはてな内でいろいろ議論された結果、定義がはっきりしてない言葉ってことで終わったようです。やっぱりネットっておもしろいなぁと思って読みふけっていました。
あと気になるのがこちら。リソース浮くパターンがあるけど、3.0じゃ直せないらしい。でも、なんで浮くのかよくわかりません…
http://blogs.msdn.com/ericlippert/archive/2007/06/06/fyi-c-and-vb-closures-are-per-scope.aspx
Eric Lippertさん、すごい人ですねぇ。C#のあらゆるところをつつきまわしてます。blogは文章多いし、しかも濃いんで、読むのが難しいんですが、なんで同じ言語使っててこんなにいろんなところに気が付くのか不思議です。写真みつけた。http://www.amazon.com/gp/pdp/profile/A3P2N0LR8NZYI6
匿名メソッドを堪能したい方はこちらw
http://blogs.msdn.com/grantri/archive/category/3378.aspx
どこかでこの、環境の値を変えるとクロージャ内から見える値も一緒に変わってしまうのは、最初はLisp実装のバグだったと読んだような気がします。
# Expression Treeがわからないので、クイズの2問目がさっぱりorz Expression Treeの解説ってどこかにないでしょうか…