Frage

Ich bin von der Syntax verwirrt zum Entfernen von Event-Handler in C #.

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

Die „neue“ erzeugt ein neues Objekt in jeder Zeile, so dass Sie ein Objekt hinzufügen und dann fragt, ein anderes Objekt zu entfernen.

Was wirklich unter die Decke geht, dass dies funktionieren?
Es ist sicher nicht offensichtlich von der Syntax.

War es hilfreich?

Lösung

Die + = und die - = sind Syntax-Kurzbefehle für eingebaute interne Methoden namens Add () und Remove (), die hinzugefügt werden sollen oder einen Zeiger auf einen internen verknüpften Liste der Delegierten entfernen, dass der Delegierte hat als privater Bereich . Wenn Sie Remove laufen, beginnt er an der Spitze der verknüpften Liste und prüft jede Delegierte in der Liste einer nach dem anderen, bis er einen findet, „gleich“ zu dem ist, das Sie auf die Remove () -Methode übergeben. (Unter Verwendung von - = Syntax)

Dann entfernt sie, dass man aus der verknüpften Liste und Patches die Liste zu behalten, es ist Konnektivität ...

In diesem Zusammenhang werden die Worte ‚equals‘ -Methode (für einen Delegierten ()) ist so außer Kraft gesetzt, dass es nur das Ziel des Delegierten vergleicht und die methodPtr, die die gleiche sein wird, auch wenn Sie einen neuen Delegaten erstellt haben passieren zu entfernen ...

Andere Tipps

Die „neue MyHandler“ ist eigentlich überflüssig. Sie können einfach tun

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

Alle Veranstaltungen in C # sind Multicastdelegaten, so die + = und -. = Syntax zeigt an, dass Sie hinzufügen / einen Vertreter in die Liste der Delegierten zu entfernen, die aufgerufen wird,

Was, was los ist hinter den Kulissen, die beste Erklärung, dass ich gefunden habe, ist Jon Skeet .

können Sie denken an Veranstaltungen finden als Platzhalter Methoden für die delegierten Logik, die ausgeführt wird, wenn das Ereignis ausgelöst wird. Ein einzelne Ereignis kann mehrere Teilnehmer (Multi-Casting) hat, so dass die + = und - = Syntax ist, wie ein einziger Ereignishandler angebracht oder entfernt wird. Einfach Zuordnung tun würde die Veranstaltungs-Abonnements zurückgesetzt, die unerwünschten Nebenwirkungen führen kann.

EDIT: Link mehr über Vielseitigkeit in C #, erklärt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top