Wie kann ich Ereignisabonnements in C # löschen?
Nehmen Sie die folgenden C# - Klasse:
c1 {
event EventHandler someEvent;
}
Wenn es gibt eine Menge von Abonnements c1
's someEvent
Veranstaltung und ich möchte, dass Sie alles klar, was ist der beste Weg, dies zu erreichen? Auch berücksichtigen, dass Abonnements für diese Veranstaltung könnten sein/sind lambdas/anonyme Delegaten.
Derzeit meine Lösung ist das hinzufügen einer ResetSubscriptions()
Methode c1
setzt someEvent
auf null. Ich weiß nicht, ob das irgendwie ungesehen Folgen.
InformationsquelleAutor der Frage programmer | 2008-09-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Innerhalb der Klasse können Sie die (versteckten) Variablen auf null. Ein null-Verweis ist die kanonische Form der Darstellung eine leere Anrufung Liste, effektiv.
Außerhalb der Klasse, Sie können das nicht tun - Ereignisse, die im Grunde setzen Sie auf "abonnieren" und "abbestellen" und das ist es.
Lohnt es sich zu wissen, was Feld-wie die Ereignisse tatsächlich tun - Sie erstellen eine variable und ein Ereignis zur gleichen Zeit. Innerhalb der Klasse, die Sie bis Ende verweisen auf die variable. Von außen verweisen Sie auf das Ereignis.
Siehe meine Artikel über Ereignisse und Delegaten für weitere Informationen.
InformationsquelleAutor der Antwort Jon Skeet
Fügen Sie eine Methode c1, 'someEvent' zu null...
InformationsquelleAutor der Antwort programmer
Es ist besser, Stellvertretung{} als null
InformationsquelleAutor der Antwort Feng
Einstellung die Veranstaltung auf null innerhalb der Klasse funktioniert. Wenn Sie über eine Klasse, die Sie sollten immer gesetzt den Fall auf null, der GC hat Probleme mit Ereignisse und können nicht bereinigen die entsorgt Klasse, wenn es baumelt Veranstaltungen.
InformationsquelleAutor der Antwort Jonathan C Dickinson
Die beste Vorgehensweise zum löschen aller Abonnenten ist die someEvent auf null, indem Sie hinzufügen eine weitere öffentliche Methode, wenn Sie möchten, setzen Sie diese Funktion, um draußen. Dies hat keine unsichtbaren Folgen. Die Voraussetzung ist daran zu erinnern, zu erklären, SomeEvent mit dem Schlüsselwort 'event'.
Finden Sie das Buch - C# 4.0 in der Nußschale, Seite 125.
Einige hier vorgeschlagen
Delegate.RemoveAll
Methode. Wenn Sie es verwenden, die Beispielcode könnte, befolgen Sie die unten aufgeführten Formular. Aber es ist wirklich dumm. Warum nicht einfachSomeEvent=null
innerhalb derClearSubscribers()
Funktion?InformationsquelleAutor der Antwort Cary
Können Sie erreichen dies, indem Sie die Stellvertretung.Entfernen oder zu Delegieren.RemoveAll Methoden.
InformationsquelleAutor der Antwort Micah
Konzeptionelle erweitert langweilig Kommentar.
Ich eher das Wort "event-handler" statt "Veranstaltung" oder "delegieren". Und das Wort "event" für andere Sachen. In einigen Programmiersprachen (VB.NET, Object Pascal, Objective-C), "Ereignis" wird als "Nachricht" oder "signal" und sogar eine "message" - Schlüsselwort und die konkrete Zucker syntax.
Ist, und, um darauf zu reagieren "Meldung", "event-handler" zu reagieren, ob es sich um einen einzelnen Delegierten oder mehrere Delegierte.
Zusammenfassung:
"Ereignis" ist die "Frage", "event handler (s)" sind die Antwort (en).
InformationsquelleAutor der Antwort umlcat
Dies ist meine Lösung:
Müssen Sie rufen Sie
Dispose()
oder verwenden Sieusing(new Foo()){/*...*/}
Muster um sich abzumelden alle Mitglieder der Aufruf-Liste.InformationsquelleAutor der Antwort Jalal
Entfernen Sie alle Veranstaltungen, übernehmen die Veranstaltung ist ein "Action" - Typ:
InformationsquelleAutor der Antwort Googol