Die kurze Antwort ist: es sei denn, es hat unmanaged Ressourcen (Datei behandelt etc) müssen Sie sich keine Sorgen machen.
Die lange Antwort ist ein bisschen mehr beteiligt.
Wenn .NET beschließt, etwas Speicher freizugeben, wird der Garbage Collector ausgeführt. Es sucht nach allen Objekten, die noch verwendet werden, und markiert sie als solche. Jede lokale Variable (in irgendeinem Stapelrahmen eines beliebigen Threads), die noch gelesen werden kann, zählt als root ebenso wie statische Variablen.(Tatsächlich glaube ich, dass statische Variablen über Live-Type-Objekte referenziert werden, die über Live-AppDomain-Objekte referenziert werden, aber größtenteils können Sie statische Variablen als Roots betrachten.)
Der Garbage Collector betrachtet jedes Objekt, auf das verwiesen wird durch eine Wurzel und findet dann mehr "lebende" Referenzen basierend auf den Instanzvariablen innerhalb dieser Objekte. Es regt sich auf und findet und markiert mehr und mehr Objekte als "live". Sobald es diesen Prozess beendet hat, kann es dann alle Rest der Objekte betrachten und sie befreien.
Das ist ein sehr breites konzeptionelles Bild ist - aber es viel detailliertere erhält, wenn Sie von der Generationen Modell der Garbage Collection denken, Finalizers, gleichzeitige Sammlung usw. stark Ich empfehle Ihnen, Jeff Richter CLR via C# lesen, die in diese geht in vielen Details. Er hat auch einen twopart Artikel (zurück aus dem Jahr 2000, aber immer noch sehr relevant), wenn Sie das Buch nicht kaufen wollen.
Natürlich bedeutet dies nicht, dass Sie sich keine Gedanken über Speicherauslastung und Objektlebensdauer in .NET machen müssen. Insbesondere gilt Folgendes:
- Erstellen von Objekten pointlessly werden Kostenleistung. Insbesondere ist der Müllsammler schnell aber nicht frei. Suchen Sie nach einfache Möglichkeiten, um Ihren Speicherverbrauch zu reduzieren, wie Sie programmieren, aber Mikro-Optimierung, bevor Sie wissen, dass Sie ein Problem haben, ist auch schlecht.
- Es ist möglich, Speicher zu "lecken", indem Objekte länger als beabsichtigt erreichbar gemacht werden. Zwei recht häufige Ursachen dafür sind statische Variablen und Ereignisabonnements. (Ein Ereignisabonnement macht den Ereignishandler vom Ereignisherausgeber aus erreichbar, aber nicht andersherum.)
- Wenn Sie mehr Speicher (live, erreichbar) als verfügbar verwenden, stürzt Ihre App ab. Es gibt nicht viel .NET kann das verhindern!
- Objekte, die Ressourcen ohne Arbeitsspeicher verwenden, implementieren normalerweise
IDisposable
. Sie sollten Dispose
auf ihnen aufrufen, um diese Ressourcen freizugeben, wenn Sie mit dem Objekt fertig sind. Beachten Sie, dass nicht das Objekt selbst freigibt - nur der Garbage Collector kann das tun. Die using
-Anweisung in C# ist die bequemste Methode, Dispose
zuverlässig aufzurufen, selbst wenn es sich um eine Ausnahme handelt.
Sorry für den Schnitt, ich versuche nur, Probleme zu stoppen, bevor es versehentlich beginnt - nichts für ungut. –
Lol, und ich * so * wollte, dass mir jemand sagte, wie man das * bestimmte * Variable löscht ... –
@lc Und natürlich keine Beleidigung genommen :-) –