Da C # Garbage Collection verwendet. Wann muss .Dispose verwendet werden, um den Speicher freizugeben?
Ich weiß, dass es ein paar Situationen gibt, also werde ich versuchen, diejenigen aufzulisten, die mir einfallen.
Wenn Sie die Komponenten korrekt definiert haben, sollten sie theoretisch nicht erforderlich sein, um Dispose () für Ihre Objekte aufzurufen, da der Finalizer dafür sorgen sollte .
Wenn Sie ein Objekt verwenden, das IDisposable implementiert, ist es empfehlenswert, Dispose () für das Objekt aufzurufen, sobald Sie damit fertig sind.
Für einige Ihrer spezifischen Punkte:
1) Wenn Sie wissen, dass Sie mit dem Formular "fertig" sind, können Sie Dispose () aufrufen. Dies erzwingt eine Bereinigung zu dem Zeitpunkt der nicht verwalteten Ressourcen, die dem Formular zugeordnet sind.
2) In diesem Fall: Wenn Ihr Objekt nur in dieser Methode verwendet wird, verwenden Sie stattdessen "using":
%Vor%3) Es gibt seltene Gründe, dies zu tun, aber im Allgemeinen, nein.
4) Ereignisse sind ein Delegat - der mit dem Delegaten verknüpfte Speicher wird gesammelt, nachdem der Delegat selbst entwurzelt wurde. Dies geschieht normalerweise, wenn die betreffenden Objekte nicht gelootet werden.
Sie sollten Dispose
auf für jede Klasse aufrufen, die IDisposable implementiert. Wenn es nicht Dispose
ed sein müsste, würde es IDisposable
nicht implementieren.
Was Ihre anderen Fragen betrifft:
Controls
implementiert, müssen Sie IDisposable
aufrufen. Wenn Sie beispielsweise Dispose
aufrufen, muss der FileStream entfernt werden, da IDisposable implementiert wird. Ich würde vorschlagen, dass Sie das Konstrukt new FileStream(...)
in C # lesen, das die Verarbeitung von using
-Objekten erleichtert. Sehen Sie sich diese Frage an:
Wenn Ihre Klasse die IDisposable-Schnittstelle instanziiert, bedeutet dies (wahrscheinlich), dass sie über Systemressourcen verfügt, die direkt entsorgt werden müssen. Ein einfacher Weg, dies zu erreichen, ist das using-Schlüsselwort, wie in:
%Vor%per @Matt S Antwort in dieser Frage, auf die ich verwiesen habe.
Für Ihre Fragen:
Wie Reed Copsey sagte, ist es normalerweise nicht notwendig, Dispose anzurufen.
Ein möglicher Fall, der Ihr Problem möglicherweise verursacht, ist, dass ein statisches Objekt Verweise auf andere Objekte enthält, die an keiner anderen Stelle mehr verwendet werden. Der folgende Code zeigt ein Beispiel:
%Vor%Wenn aus irgendeinem Grund beim Entladen des Formulars die Ereignisverwaltung nicht vom Code aufgehoben wird, wird die Formularinstanz weiterhin vom Statusobjekt referenziert.
Tags und Links memory-leaks .net c# memory-management