2009-04-03 24 views
3
EventHandler a = new EventHandler(control_RegionChanged); 
EventHandler b = new EventHandler(control_RegionChanged); 

if (a == b) 
{ 
    Console.WriteLine("Same!"); 
} 
else 
{ 
    Console.WriteLine(a.GetHashCode() + " " + b.GetHashCode()); 
} 

これは、Same!をコンソールに書き込みます。デリゲートの新しいインスタンスでイベントの登録を解除する

control.RegionChanged += new EventHandler(control_RegionChanged); 
control.RegionChanged -= new EventHandler(control_RegionChanged); 

このコードの実行後、EventHandlerは登録解除されていますか?

答えて

7

はい。代理人はインスタンスとMethodInfoで比較されます。それらが同じであれば、それは動作します。この問題は、匿名メソッドを登録解除しようとするときに発生します。その場合、退会するために代理人への参照を保持する必要があります。だから、

control.SomeEvent += obj.SomeMethod; 
//... 
control.SomeEvent -= obj.SomeMethod; 

しかし、これは非常にリスクの高いです:

これは結構です

control.SomeEvent += delegate {Trace.WriteLine("Foo");}; 
//... 
control.SomeEvent -= delegate {Trace.WriteLine("Foo");}; 

匿名メソッドで正しいプロセスは次のとおりです。

EventHandler handler = delegate {Trace.WriteLine("Foo");}; 
control.SomeEvent += handler; 
//... 
control.SomeEvent -= handler; 
0

これはまた、( - 実際にそれをテストしていないメモリからの)動作するはず

control.RegionChanged += control_RegionChanged 
control.RegionChanged -= control_RegionChanged 

を使用してみてください。少なくとも、新しいイベントハンドラ参照は作成されません。

+0

実はそれはそうです。コンパイラはあなたのためにそれを行います。 – Samuel

+0

私はちょうどそれをテストしました。そして、少なくとも私のテストでは、このようにハンドラを追加して削除した後で動作します。 – Lennaert

+0

これは単に省略したものであり、コンパイラはまだ新しいEventHandlerになります。 –

関連する問題