Objectsでコードを書いたときに裏でどういう動きになっているのかなぁ、とILでイメージができなかったので読んでみたら、単にC#のラムダ式がどうなっているかという話だけだったのでまとめる。長いのでサマリ:ラムダ式を使うと、基本的に入れ子クラスが作られ、ラムダ式が使う変数をとっておかれる。ラムダ式の中身に書いたものは、基本的に入れ子クラスのメソッドとして定義される。入れ子クラスは不要なときには作られない。評価スタックでピンとこない方は「C#でHelloWorldプログラムを作成する」を読んでおくのをおすすめする。今回の説明用のサンプルコードはこちら。val)」がどうなっていくのか、というお話。}}サイズ0のint配列に100がいくつあるか調べてWriteするというコード(0に決まっている)。説明の都合、順番などが不自然な感じになっている。このソースをILに逆アセンブルした結果がこちら。https://gist.github.com/sunnyone/0d3ed8285b5d91495399別ウィンドウで開きながら説明を見るといいかも。これからILを見ていく。書いた部分がコンパイルされているであろうMainメソッドの実装を見ようとすると、そのMainメソッドの前に見知らぬ「<>c__DisplayClass1」という入れ子クラスが作られていることがわかる。そのクラスの内容はこうなっている。val」の部分を<Main>b__0というメソッドに実装し、加えてvalフィールドを持っている。次に本体のMainメソッド。Mainメソッドはこの入れ子クラスを活用して動作する。メソッドとローカル変数の定義。countのほかに、先ほどの<>c__DisplayClass1が「CS$<>8__locals2」として用意されているのがわかる。valはないことに注意。'CS$<>8__locals2')ここから処理開始だが、記述したC#コードに対応する部分に先立って、<>c__DisplayClass1がnewされ、ローカル変数に入る。