私はしばらくこれを行っていますが、イベントハンドラーを削除するたびにnew
を使用していることに気付きませんでした。新しいオブジェクトを作成するはずですか?
基本的に1と2の違いはありますか?
ethernetdevice.PcapOnPacketArrival -= new SharpPcap.PacketArrivalEvent(ArrivalResponseHandler);
ethernetdevice.PcapOnPacketArrival -= ArrivalResponseHandler;
EDIT:わかりました、これは複製です。申し訳ありません。回答の投稿 こちら 。
同じターゲット、メソッド、および呼び出しリストを持つ同じタイプの2つのデリゲートは等しいと見なされます。
1と2の間に違いはありません。これは、2が1の構文シュガーであるためです。2が実際のメソッド名ではなくクラスレベルのデリゲートインスタンスフィールドを参照する場合のみ、コンパイルされたILに違いがあります。
実行時に発生することに関して、イベントRemove
メソッドは、それに渡されたデリゲートインスタンスがAdd
メソッドに渡されたインスタンスと同じであるかどうかを気にしません。これがなぜなのかをすぐに思い出すことはできませんが、デリゲートインスタンスは常にインターンされていると思います。
編集: Jon Skeetは、イベントRemove
メソッドは値の等価性(Delegate.Equals
)を使用して、リストから削除するデリゲートを決定します。同じ最終結果、異なる方法。 :-)
2番目のバージョンは最初のバージョンと同等です。短い構文を使用するだけです。これはC#2.0で実装されました