web-dev-qa-db-ja.com

C#イベントハンドラーの削除

私はしばらくこれを行っていますが、イベントハンドラーを削除するたびにnewを使用していることに気付きませんでした。新しいオブジェクトを作成するはずですか?

基本的に1と2の違いはありますか?

  1. ethernetdevice.PcapOnPacketArrival -= new SharpPcap.PacketArrivalEvent(ArrivalResponseHandler);

  2. ethernetdevice.PcapOnPacketArrival -= ArrivalResponseHandler;

EDIT:わかりました、これは複製です。申し訳ありません。回答の投稿 こちら

同じターゲット、メソッド、および呼び出しリストを持つ同じタイプの2つのデリゲートは等しいと見なされます。

26
Sharun

1と2の間に違いはありません。これは、2が1の構文シュガーであるためです。2が実際のメソッド名ではなくクラスレベルのデリゲートインスタンスフィールドを参照する場合のみ、コンパイルされたILに違いがあります。

実行時に発生することに関して、イベントRemoveメソッドは、それに渡されたデリゲートインスタンスがAddメソッドに渡されたインスタンスと同じであるかどうかを気にしません。これがなぜなのかをすぐに思い出すことはできませんが、デリゲートインスタンスは常にインターンされていると思います。

編集: Jon Skeetは、イベントRemoveメソッドは値の等価性(Delegate.Equals)を使用して、リストから削除するデリゲートを決定します。同じ最終結果、異なる方法。 :-)

29

2番目のバージョンは最初のバージョンと同等です。短い構文を使用するだけです。これはC#2.0で実装されました

13
Adam Maras