Sie müssen genauer sein. Sie müssen nicht überprüfen, ob ALLE Ereignisdelegierten abgemeldet wurden, da ein Abonnent in einem häufigen Fall ein kürzeres Leben hat als ein Publisher. Und ein Speicherverlust tritt nur dann auf, wenn Ihr Abonnent länger lebt als ein Publisher. Daher gibt es eine Referenz, die GC daran hindert, das Publisher-Objekt zu sammeln.
Jetzt müssen wir sicherstellen, dass Sie sich abmelden, wenn Sie ein Ereignis auf einem relativ kurzlebigen Objekt abonnieren.
Eine Heuristik, die ich in diesem Fall entwickeln kann: analysieren Sie alle Objekte mit lokaler Variablen (die durch den aktuellen Codeblock {} definiert sind) und alle Objekte, die Sie explizit disposieren. Notieren Sie für jedes Ereignis auf diesen Objekten die Anzahl der Abonnements und die Anzahl der Abmeldungen. Wenn die erste Zahl größer ist, geben Sie eine Warnung ab.
Natürlich deckt das nicht alle Fälle ab, aber ich denke, dass kein statischer Ansatz alle Fälle in diesem Problem abdecken kann, Sie brauchen eine Methode, die gut genug ist.
Ich werde hier nicht die Vorteile der dynamischen Analyse und Code-Reviews erwähnen, da es sich um ein separates Thema handelt, das nicht mit der Frage zusammenhängt.
danke das ist am nächsten zu der Antwort, die ich gesucht habe. Aber in Fairness sind auch die anderen Antworten wahr, und wir implementieren, wo immer möglich, schwache Referenzen. –