Explizite Ereignis hinzufügen/entfernen, missverstanden?
Ich habe auf der Suche in den Speicher-management vor kurzem eine Menge und schaue, wie die Ereignisse verwaltet, nun, ich sehe das explizite hinzufügen/entfernen-syntax für Ereignis-Abonnement.
Ich denke, es ist ziemlich einfach, hinzufügen/entfernen, nur erlaubt mir eine andere Logik, wenn ich abonnieren und kündigen? Bekomme ich es, oder ist es mehr?
Auch, während ich hier bin, irgendwelche Ratschläge /best practices für die Reinigung meiner Ereignis-handles.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinzufügen/entfernen-syntax wird Häufig verwendet, um "vorwärts", einer Veranstaltung die Umsetzung in eine andere Klasse.
Reinigung Abonnements (nicht "event verarbeitet") erfolgt am besten durch Umsetzung
IDisposable
.UPDATE: Es gibt einige Variationen auf das Objekt zu implementieren sollte
IDisposable
. Das Rx-team die beste Entscheidung, die von einer design-Perspektive: Abonnements selbstIDisposable
. Regelmäßigen .NET Ereignisse nicht möglich, ein Objekt darstellt, das Abonnement, so ist die Wahl zwischen dem Verlag (der Klasse, auf dem das Ereignis definiert ist) und dem Abonnenten (in der Regel die Klasse, die enthält die member-Funktion gezeichnet). Während meines design-Instinkte lieber machen die AbonnentenIDisposable
, meisten real-world-code macht der VerlagIDisposable
: es ist eine einfachere Umsetzung, und es kann Fälle geben, in denen es nicht eine tatsächliche Abonnenten Instanz.Wird(wenn der code tatsächlich bereinigt Ereignis-Abonnements an alle. Die meisten code nicht.)
Hinzufügen/entfernen von Eigenschaften sind im Grunde der gleichen Logik, mit set - /get-Eigenschaften mit den anderen Mitgliedern.
Es erlaubt Ihnen, erstellen Sie einige zusätzliche Logik bei der Registrierung für eine Veranstaltung, und kapselt das Ereignis selbst.
Ein gutes Beispiel dafür, WARUM würden Sie wollen, es zu tun, ist zu stoppen extra Berechnung, wenn es nicht nötig ist (niemand hört dem Ereignis).
Zum Beispiel, können sagen, dass die Ereignisse, die ausgelöst werden, durch einen timer, und wir nicht wollen, dass die timer funktionieren, wenn niemand registriert ist, zu der Veranstaltung:
Würden Sie wahrscheinlich wollen, um es zu sperren hinzufügen/entfernen mit einem Objekt (ein Nachzügler)...
Ja, der hinzufügen/entfernen-syntax können Sie der Umsetzung Ihrer eigenen Abo-Logik. Wenn Sie lassen Sie Sie aus (die standard-notation für ein Ereignis), generiert der compiler standard-Implementierungen. Das ist wie die auto-Eigenschaften.
In dem folgenden Beispiel, es gibt keinen wirklichen Unterschied zwischen Event1 und Event2.
Aber das ist ein separates Thema aus 'bereinigen' - Handler. Es ist die abonnieren-Klasse, die tun sollten, die sich Abmelden. Die publishing-Klasse kann nicht helfen, mit dieser sehr viel.
Stellen Sie sich eine Klasse, die würde 'sauber' ist, den Abo-Liste Ihrer Veranstaltungen. Es kann nur sinnvoll tun, wenn er Entsorgt sich selbst, und dann ist es eher unwahrscheinlich produktiv zu sein als Entsorgt Klasse wird in der Regel Sammlerstücke, kurz nachdem er Entsorgt wird.
Foo foo = ...; foo.Event1(sender, e);
aber tun konntefoo.Event2(null, null);
.error CS0070: The event 'Program.Foo.Event2' can only appear on the left hand side of += or -= (except when used from within the type 'Program.Foo')
.