Seit PPMM
ein langlebiges Objekt (Singleton) ist, macht dieser Code nicht viel Sinn.
Das Problem dabei ist, dass, solange der Ereignishandler das Objekt referenziert, er kommt nicht für die Müllabfuhr in Frage solange das andere Objekt, dem das Ereignis gehört, am Leben ist.
Daher ist es sinnlos, irgendetwas in den Destruktor zu schreiben, denn entweder:
- Der Ereignishandler wurde bereits entfernt, so dass das Objekt für die Garbage Collection in Frage kommt.
- Der Event-Handler wird nicht entfernt, das besitzende Objekt kommt nicht für die Garbage Collection in Frage, und daher wird der Finalizer nie aufgerufen
- Beide Objekte kommen für die Garbage Collection in Frage. In diesem Fall sollten Sie im Finalizer überhaupt nicht auf das andere Objekt zugreifen, da Sie dessen internen Zustand nicht kennen
Kurz gesagt, Tun Sie das nicht .
Nun könnte man auch anders argumentieren, wenn man einen solchen Code in die Dispose
Methode, wenn Sie Folgendes implementieren IDisposable
. Unter dass Fall macht es durchaus Sinn, da der Usercode, der die Dispose
an einem vorher festgelegten und kontrollierten Punkt.
Der Finalizer (Destruktor) wird jedoch nur aufgerufen, wenn das Objekt für die Garbage Collection in Frage kommt und über einen Finalizer verfügt, was in diesem Fall sinnlos ist.
Was die Frage Nr. 2 betrifft, die ich als "Kann ich mich von solchen Veranstaltungen abmelden" verstehe, so können Sie dies tun. Das einzige Mal, dass Sie den Delegaten, mit dem Sie sich angemeldet haben, behalten müssen, ist, wenn Sie den Delegaten um eine anonyme Methode oder einen Lambda-Ausdruck herum konstruieren. Wenn Sie es um eine vorhandene Methode konstruieren, wird es funktionieren.
bearbeiten : WPF. Richtig, ich habe diesen Tag nicht gesehen. Sorry, der Rest meiner Antwort macht nicht viel Sinn für WPF und da ich kein WPF-Guru bin, kann ich nicht wirklich sagen. Wie auch immer, es gibt eine Möglichkeit, dies zu beheben. Es ist hier auf SO völlig legal, den Inhalt einer anderen Antwort zu klauen, wenn man ihn verbessern kann. Also, wenn jemand weiß, wie man richtig tun dies mit einem WPF-Benutzerelement, Sie sind frei, den gesamten ersten Abschnitt meiner Antwort zu heben und fügen Sie die relevanten Bits von WPF.
bearbeiten : Lassen Sie mich auch hier auf die Frage in dem Kommentar antworten.
~~
Da es sich bei der betreffenden Klasse um ein Benutzersteuerelement handelt, ist ihre Lebensdauer an ein Formular gebunden. Wenn das Formular geschlossen wird, werden alle untergeordneten Steuerelemente, die es besitzt, entsorgt, mit anderen Worten, hier ist bereits eine Dispose-Methode vorhanden .
Wenn ein Benutzersteuerelement seine eigenen Ereignisse verwaltet, ist der korrekte Weg, um dies zu handhaben, das Aushängen der Ereignishandler in der Dispose-Methode.
~~
(Rest entfernt)