読者です 読者をやめる 読者になる 読者になる

Anonymous Method を使ったイベントの解除

.NET

C# 2.0 and IDE Tips & Tricks Part I のあとで周りの人と話していたネタより.
Anonymous Method を使うと簡単にイベントハンドラを追加することができますが,さてその追加したハンドラを解除するにはどうすればよいでしょうというお話.
会場では一旦変数に代入しましょうという感じでまとまりました*1.以下は一度だけ実行されるイベントハンドラの例です.

EventHandler handler = null;
handler = delegate(object _sender, EventArgs _e)
    {
        MessageBox.Show("Clicked");
        this.button1.Click -= handler;
    };
this.button1.Click += handler;

この例だと,こっそり IDisposable なオブジェクト(this : System.Windows.Forms.Form)がキャプチャされているあたりがさりげなく危険な香りでしょうかね.いずれにせよ Anonymous Method や Iterator は今後どういうバグパターンが出てくるか楽しみな領域です.

*1:後であちこち調べてみたのですが,Anonymous Method Identity Crisis でも変数に残せと書かれてますね.