1

重複の可能性:
イベントハンドラーの登録を正しく解除する方法

MSDNは、次の2つのイベントサブスクリプションはまったく同等であると述べています(C#2.0と1.0の構文)。

publisher.CustomEvent += HandleCustomEvent;
publisher.CustomEvent += new CustomEventHandler(HandleCustomEvent);

新しい構文では、デリゲートオブジェクトのインスタンス化が非表示になっていることに注意してください。

後で適切に退会できるように、代理人への参照を保持する必要がありますか?

// Retain reference to delegate used to subscribe.
this.handleCustomEvent = new CustomEventHandler(HandleCustomEvent);
publisher.CustomEvent += this.handleCustomEvent;
...
// Use earlier reference to unsubscribe.
publisher.CustomEvent -= this.handleCustomEvent;

または、これは同じことですか?

publisher.CustomEvent += HandleCustomEvent;
...
publisher.CustomEvent -= HandleCustomEvent;

それらが同じである場合、なぜですか?

-= HandleCustomEventまた、作成しますかnew()?もしそうなら、このオブジェクトはによって作成されたオブジェクトと違いはありません+= HandleCustomEventか?

4

2 に答える 2

1

これは私が思うのとまったく同じことです。あなたは2番目の速記構文ビットに焦点を合わせただけです。

イベントハンドラーの登録を正しく解除する方法

それだけでは答えませんが、これを追加したかったのですが...

必要に応じて、これらの問題から解放されるRx-ReactiveExtensionsをご覧ください。イベントをより早く「停止」したい場合を除いて、基本的に登録解除は必須ではありません(これは簡略化されており、詳細があります)

于 2012-04-08T00:58:26.940 に答える
1

-= HandleCustomEventまた、作成しますかnew()?もしそうなら、このオブジェクトはによって作成されたオブジェクトと違いはありません+= HandleCustomEventか?

はい、はい。

私の知る限り、Delegate.RemoveのMSDNドキュメントでは、 2つのデリゲートが等しいかどうかを判断する方法について具体的に説明されていません。ただし、Delegate.EqualsMulticastDelegate.RemoveImplを使用して同等性を判断しているようであり、それ文書化されています。

メソッドとターゲットは、次のように同等であるかどうかが比較されます。

  • 比較される2つのメソッドが両方とも静的であり、同じクラスの同じメソッドである場合、メソッドは等しいと見なされ、ターゲットも等しいと見なされます。
  • 比較される2つのメソッドがインスタンスメソッドであり、同じオブジェクトの同じメソッドである場合、メソッドは等しいと見なされ、ターゲットも等しいと見なされます。
  • それ以外の場合、メソッドは等しいとは見なされず、ターゲットも等しいとは見なされません。

したがって、渡さ-=れたデリゲートがに渡されたデリゲートと同じインスタンスではない場合+=でも、イベントは正常にサブスクライブ解除されます。

于 2012-04-08T01:09:55.227 に答える