2009-07-29 5 views
13

Ich frage mich, ob ein Objekt auf null Einstellung werden alle Eventhandler bereinigen, die zu den Objekten Ereignisse gebunden sind ...C# Explizit Entfernen von Ereignis-Handlers

z.B.

Button button = new Button(); 
button.Click += new EventHandler(Button_Click); 
button = null; 

button = new Button(); 
button.Click += new EventHandler(Button_Click); 
button = null; 

etc ...

Wird dies verursacht ein Speicherleck?

Antwort

16

Wenn es nirgendwo andere Verweise auf button gibt, müssen Sie den Ereignishandler hier nicht entfernen, um ein Speicherleck zu vermeiden. Ereignisbehandlungsroutinen sind Einwegverweise, so dass sie nur entfernt werden müssen, wenn das Objekt mit Ereignissen langlebig ist und Sie vermeiden möchten, dass die Behandlungsroutinen (d. H. Objekte mit Behandlungsmethoden) länger leben, als sie sollten. In Ihrem Beispiel ist dies nicht der Fall.

+0

Bedeutet dies, dass Ereignisbehandlungsroutinen für Anwendungsleisten nicht explizit entfernt werden müssen (z. B. statechanged)? –

+0

Dies ist eine umgekehrte Situation. AppBar ist ein langlebiges Objekt, und ein Ereignishandler würde das Objekt, auf das sich die Delegierten beziehen, mindestens so lange am Leben halten, wie AppBar am Leben ist, und das könnte nicht passieren. Wenn der Handler andererseits eine Methode für das Fenster ist, das die Leiste besitzt, spielt dies keine Rolle. –

8

Siehe die Diskussion here under "The final question: do we have to remove event handlers?"

Fazit: Sie Delegierten aus Ereignissen entfernen sollten, wenn sie außerhalb der Klasse erreichen selbst; Wenn Sie externe Veranstaltungen abonnieren, sollten Sie Ihr Abonnement beenden, wenn Sie fertig sind. Andernfalls wird Ihr Objekt länger am Leben erhalten als erforderlich.

11

Zusammenfassung: Sie müssen sich explizit abmelden, wenn die Ereignisquelle/der Herausgeber langlebig ist und die Abonnenten nicht. Wenn die Ereignisquelle die Abonnenten überlebt, werden alle registrierten Abonnenten von der Ereignisquelle "am Leben" gehalten (nicht vom GC erfasst), sofern sie sich nicht abmelden (und den Verweis auf sich selbst aus der Benachrichtigungsliste des Ereignisherausgebers entfernen) Auch dies ist ein Duplikat von Is it necessary to explicitly remove event handlers in C# und hat einen guten Titel n Antwort. Also abstimmen um zu schließen.

+0

Ich sah, dass Q & A. Meine Frage ist viel geradliniger und erfordert eine viel einfachere Antwort. – Damien

Verwandte Themen