Ich stieß auf folgendes Zitat: "Destruktoren werden nicht garantiert aufgerufen." und das macht mir Angst.
Weiter heißt es, dass sogar ein try-finally-Block unterbrochen werden kann, was Speicherlecks verursacht.
Es gibt eine Lösung, indem Sie entweder Ihren Code in CER (Constrained Execution Region) setzen oder von CriticalFinalizerObject
ableiten.
Meine Frage ist
CriticalFinalizerObject
verwenden, falls vorhanden? CriticalFinalizerObject
wirklich nützlich war? Warum verlassen Sie sich auf Destruktoren? die meiste Zeit brauchst du sie nicht.
Vielleicht werfen Sie einen Blick auf IDisposeable und das Entsorgungsmuster.
Hier einige Links, die mir helfen, dieses Thema zu verstehen
- & gt; Jeder denkt über die falsche Garbage Collection nach
- & gt; So implementieren Sie das Dispose-Muster
- & gt; Implementieren von "Abschließen und Löschen" zum Bereinigen nicht verwalteter Ressourcen
>Zu Frage Nr. 3: Speicherlecks würden normalerweise verursacht durch:
Nicht verwaltete Ressourcen werden nicht freigegeben. Für diese ist die Verwendung von IDisposable (mit einem Fallback-Aufruf an Dispose () im Finalizer) der beste Ansatz.
Verweise auf verwaltete Objekte, die verwaltet werden, weil andere Objekte immer noch auf sie verweisen, obwohl sie eigentlich entfernt werden sollen. IHMO, das ist eher ein Problem der Code-Qualität als ein Low-Level-Problem mit Garbage Collection.
Wenn Sie nicht in tatsächliche Speicherlecks geraten, sollten Sie sich nicht einmal darum kümmern und nicht versuchen, irgendein Verhalten zu erzwingen.
Ich würde vorschlagen, die Schnittstelle IDisposable
für alle Ressourcen zu verwenden, die zerstört werden müssen, und sie in einem using
-Block zu verwenden.
Normalerweise werden die Unterschiede zwischen einem normalen Finalizer und einem kritischen Finalizer nur beim Entladen von AppDomain wichtig. Da die meisten nicht verwalteten Ressourcen automatisch beim Entladen des Prozesses verloren gehen, müssen Sie sich normalerweise nur um die kritische Finalisierung kümmern, wenn Sie AppDomain
s sauber entladen möchten, während Sie den Prozess am Laufen halten.