2009年3月13日金曜日

イベントの多重登録

以前、デリゲートの等価性は、呼び出し先のメソッドが同じかどうかで判断される事を書いた。

ところが、
Button1.Click+=new EventHandler(foo);
Button1.Click+=new EventHandler(foo);
すると、ボタン一回のクリックに対してfooが二回呼び出される。等価なメソッドの多重登録が許されているという事。ちょっと吃驚した。面白い仕様だ。

でも、デリゲートの等価性の帰結として、この二つのイベントハンドラを削除する時、右辺で生成したデリゲートへのインスタンスへの参照を保持しておく必要はない。
Button1.Click-=new EventHandler(foo);
Button1.Click-=new EventHandler(foo);
でOK。このために、

Button1.Click+=foo;
Button1.Click-=foo;
でfooが(右辺でEventHandlerの別々のインスタンスが暗黙に生成されるにも関わらず)削除されるんだね。

0 件のコメント: