Ist es schlecht, um nicht aufgehoben event-Handler?
Wenn ich eine Anwendung mit nur ein paar event-Handler registriert (und der Objekte mit den Ereignissen nicht entsorgt werden, bis die Anwendung geschlossen wird), muss ich wirklich brauchen, um über die Registrierung diese Handler? Der einzige gute Grund, den ich sehen konnte ist, dass es vielleicht ein wenig zusätzlichen Aufwand, wenn Ereignisse ausgelöst wird, die man nicht unbedingt interessieren (ich.e Sie haben mehrere Handler registriert werden, um ein Ereignis). Gibt es einen anderen guten Grund für? Wer in wichtigen Fragen, weil Sie sich nicht Abmelden Ereignisse?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie
A
publishing ein Ereignis, undB
Anmeldung zu einem event (handler), dann ist es nur ein problem nicht abbestellen, wennA
wird viel länger Leben alsB
. Grundsätzlich werden die Ereignis-Abonnement bedeutet, dassA
noch sehen kannB
, so würde verhindern, dass Müll gesammelt, und würde immer noch auslösen von Ereignissen auf, auch wenn Sie vergessen haben über Sie (und vielleichtDisposed()
es).Dies ist ein Beispiel für ein problem, wenn
A
ist ein statisches Ereignis, und Ihre app läuft für eine Weile nachB
stirbt... AberB
wird Leben, solangeA
soB
werden nicht von der garbage Collection eingesammelt.Es ist wichtig zu beachten, könnte man sich Fragen, die folgende:
... Und die Antwort ist "Nein". B hat keinen Bezug zu Einem durch das Ereignis; Eine wird gesammelt werden, wie normale
B
hat keinen Bezug zuA
durch die Veranstaltung;A
wird gesammelt werden, wie normal.Viele Leute scheinen zu denken, dass es nur wichtig ist, Abmelden von Veranstaltungen falls die publisher wird, überleben die Abonnenten. Ich mag diesen Ansatz. Ein Ereignis-Abonnenten, die nicht trennen sich vom publisher erstellt einige eine böse Abhängigkeiten auf das Verhalten von Unternehmen außerhalb der Verleger und Abonnent. Wenn Sie einen Verweis auf die publisher länger gehalten als erwartet, hält die Abonnenten lebendig, zusammen mit allen Objekten, auf die der Abonnent enthält einen Verweis. Wenn eine große Masse von verlassenen Objekte sind miteinander durch event-Handler, aber keine live-Verweis vorhanden ist, um alle von Ihnen, alle Gegenstände können gefegt werden, bis der garbage collector. Wenn jedoch jemand irgendwo unerwartet hält eine Referenz auf eines der Objekte, die möglicherweise verhindern, dass Sie von einem garbage Collector entfernt wird.
IMHO ist es besser, proaktiv zu sein bei der Beseitigung von event-Handlern als darauf zu verzichten und hoffen, dass alles wird aufgeräumt. Es sei denn, man kann sicher sein, dass keine unerwarteten Verweise auf die publisher existieren kann ein solcher Ansatz ist wahrscheinlich 'meistens' funktioniert, aber gelegentliche Ursache von Speicherlecks.