イベントハンドラーがこんな形で書けるとは、知らなかった。でも、このプログラムでbutton1押した後に、button2を押すとbutton2.Textが"ABC"ではなく、"ABCabc"になる。sというstringは関数を抜けるとスタック上から消えるはず??だったが。ILDASM.exeで解析したところ、なんとコンパイラが、密かに裏でクラスを作成しstringのsはそのメンバー変数に変身していたのであった。



private void button1_Click(object sender, EventArgs e)
{
string s = "ABC", s1 = "abc";

//button2.Click += delegate(object obj, EventArgs arg)
//{
// button2.Text = s;
//};

// ↓Linq拡張でこんなふうに記述できる
button2.Click += (obj,arg)=>
{
button2.Text = s;
};

s += s1;
}