Ich lese das Buch Under the hood of .NET memory management
(veröffentlicht von Red-Gate). Sie können eine pdf version on their website finden.Event-Handler in Buch "Unter der Haube von .NET Memory Management"
Ich dachte, ich habe Event-Handler in Bezug auf die Referenzen zwischen Publishern und Abonnenten verstanden, aber die Erklärungen der Autoren zu Event-Handlern in Kapitel 5 "Anwendungsspezifische Probleme" (unter dem Titel "Windows Presentation Foundation") verwirrt mich.
Auf den Seiten 160-161 wird ein UI-Design beschrieben, das eine Master/Detail-Beziehung verwendet. Ich zitiere (Zahlen in eckigen Klammern sind Mine, um Referenzen für meine Fragen zu erstellen, pun nicht so sehr bestimmt):
Sie können mit einer Liste von Stammsätzen ein Gitter haben, und wenn Sie auf Ein Datensatz aus dem Master-Grid, ein neues Fenster öffnet sich mit den Details zu diesem Stammsatz. Wenn das Hauptfenster Ereignisse im Detailfenster [1] verdrahtet, dann kann das Detailfenster nicht bereinigt werden, bis die Ereignishandler im Hauptfenster ihre Referenzen auf das Detailfenster [2] freigeben. In diesem Fall ist das Detailfenster der Listener und das Masterfenster ist die Quelle [3]. In den meisten Fällen überlebt das Hauptfenster das Detailfenster, aber wenn die Ereignisbehandlungsroutinen nicht richtig behandelt werden, dann kann das Detailfenster nicht bereinigt werden, solange das Hauptfenster aktiv ist.
Detail.SomeEvent += new EventHandler(Master.SomeEvent_Handler); [4]
[1] Dies ist sehr unklar Terminologie. Wer "verdrahtet" wer? Von diesem allein kann ich nicht bestimmen, wer der Zuhörer ist und wer der Abonnent ist (ich kann nur annehmen ...). Der nächste Satz [3] beantwortet scheinbar genau diese Frage, indem er sagt, dass der Master die Quelle und das Detail der Listener ist, aber erst, nachdem Verwirrung durch Angabe des genauen Gegenteils in [2] eingeführt wurde (weil das Ereignis Handler sind nicht im Hauptfenster).
Das Codebeispiel [4] entspricht auch nicht dem, was in [3] gesagt wird (entspricht aber [2]). Wenn das Hauptfenster die Quelle ist, dann sollte es sein:
Master.SomeEvent += new EventHandler(Detail.SomeEvent_Handler); [5]
Richtig?
Abgesehen von all dieser Verwirrung verstehe ich Ereignishandler wie folgt. Wenn Master
Ereignisse hat, auf die Detail
subskribiert ist (wie in [5]), dann hat Master
eine Referenz auf Detail
(weil ein Verweis auf ein Löschen einer Instanz einen Verweis auf die Instanz erstellt, in diesem Fall Detail
). Solange also Master
lebt, wird Detail
ebenfalls im Speicher gehalten, es sei denn, der Ereignishandler ist vom Ereignis abgekoppelt.
Sind meine Kritik am Buch und mein eigenes Verständnis korrekt?
Was ist die Bedeutung des nicht offensichtlichen Parameters 'this'? Stellt es Kontext (wie in Javascript? (Entschuldigen Sie die Häresie))? Können Sie mich auf eine Dokumentation oder ein Buch hinweisen? Ich würde gerne mehr dazu lesen. – bvgheluwe
Nichts besonders tief. Das Ereignis ruft eine Instanzmethode auf, es benötigt eine Objektreferenz. Der Delegierte speichert es. Notieren Sie die Delegate.Target-Eigenschaft. Es ist nicht einfach zu sehen, wie es einen Wert bekommt. –