8

C# でイベント ハンドラーを削除するための構文に混乱しています。

Something += new MyHandler(HandleSomething); // add
Something -= new MyHandler(HandleSomething); // remove

「new」は各行に新しいオブジェクトを作成するため、1 つのオブジェクトを追加してから、別のオブジェクトを削除するように要求します。

これが機能する裏で実際に何が起こっているのでしょうか?
構文からは明らかではありません。

4

3 に答える 3

19

+= および -= は、デリゲートがプライベート フィールドとして持つデリゲートの内部リンク リストへのポインターを追加または削除する、Add() および Remove() という名前の組み込み内部メソッドの構文ショートカットです。Remove を実行すると、リンクされたリストの先頭から開始され、Remove() メソッドに渡したデリゲートと "等しい" デリゲートが見つかるまで、リスト内の各デリゲートが一度に 1 つずつ調べられます。( -= 構文を使用)

次に、リンクされたリストからそのリストを削除し、リンクされたリストにパッチを適用して接続を維持します...

このコンテキストでは、「equals」メソッド (delegate() 用) がオーバーライドされ、デリゲートのターゲットと methodPtr のみが比較されます。これは、Remove に渡す新しいデリゲートを作成した場合でも同じになります。 ...

于 2009-08-27T15:47:52.990 に答える
7

「新しい MyHandler」は実際には冗長です。あなたは簡単に行うことができます

Something += HandleSomething; // add
Something -= HandleSomething; // remove

C# のすべてのイベントはマルチキャスト デリゲートであるため、+= および -= 構文は、呼び出されるデリゲートのリストにデリゲートを追加/削除していることを示します。

舞台裏で何が起こっているかについて、私が見つけた最良の説明は、Jon Skeet の.

于 2009-08-27T15:50:47.743 に答える
-1

イベントは、イベントが発生したときに実行される委任されたロジックのプレースホルダー メソッドと考えることができます。1 つのイベントが複数のサブスクライバーを持つことができる (マルチキャスト) ため、+= および -= 構文は、1 つのイベント ハンドラーをアタッチまたは削除する方法です。単に割り当てを行うと、イベントのサブスクリプションがリセットされ、望ましくない副作用が発生する可能性があります。

編集:このリンクでは、C# でのイベント処理について詳しく説明しています

于 2009-08-27T15:47:20.620 に答える