Wenn ich "Method()" aufrufen, was passiert mit dem MyClass-Objekt, das im Prozess erstellt wurde?
Es wird auf dem GC-Heap erstellt. Dann wird ein Verweis auf seine Position im Heap auf den Stapel gelegt. Dann passiert der Aufruf von AnotherMethod. Dann wird die ToString-Methode des Objekts aufgerufen und das Ergebnis ausgedruckt. Dann kommt AnotherMethod zurück.
Ist es nach dem Anruf immer noch im Stapel vorhanden, obwohl es nichts verwendet?
Ihre Frage ist mehrdeutig. Mit "der Anruf" meinen Sie den Aufruf von Methode oder AnotherMethod? Es macht einen Unterschied, denn an dieser Stelle hängt es davon ab, ob Sie mit optimierten oder deaktivierten Optimierungen kompiliert haben, ob der Heap-Speicher ein Kandidat für die Garbage Collection ist. Ich werde Ihr Programm leicht ändern, um den Unterschied zu veranschaulichen. Angenommen, Sie haben:
void Method()
{
AnotherMethod(new MyClass());
Console.WriteLine("Hello world");
}
Mit Optimierungen aus, wir manchmal tatsächlich Code erzeugen, der so sein würde:
void Method()
{
var temp = new MyClass();
AnotherMethod(temp);
Console.WriteLine("Hello world");
}
In der nicht optimierten Version, wird die Laufzeit wählen, tatsächlich das Objekt als nicht- zu behandeln sammelbar, bis Method nach der WriteLine zurückkehrt. In der optimierten Version kann die Laufzeitumgebung das Objekt als sammelbar behandeln, sobald AnotherMethod zurückgegeben wird, vor der WriteLine.
Der Grund für den Unterschied liegt darin, dass die Lebensdauer der Objekte während der Debugging-Sitzungen vorhersagbarer wird, was den Leuten hilft, ihre Programme besser zu verstehen.
Oder wird es sofort entfernt?
Nichts wird sofort gesammelt; Der Müllsammler läuft, wenn es sich anfühlt, als müsste es laufen. Wenn Sie eine Ressource wie ein Datei-Handle benötigen, das sofort bereinigt wird, wenn Sie damit fertig sind, verwenden Sie einen "using" -Block. Wenn nicht, dann sollte der Garbage Collector entscheiden, wann er Speicher sammeln soll.
Muss ich es auf null setzen, damit GC es schneller bemerkt?
Müssen Sie was auf null setzen? Welche Variable hatten Sie im Sinn?
Unabhängig davon, haben Sie nicht haben, alles zu tun, um den Garbage Collector arbeiten zu lassen. Es läuft für sich alleine gut ohne Aufforderung von Ihnen.
Ich denke, dass Sie dieses Problem überdenken. Lass den Müllsammler sein Ding machen und betone nicht darüber. Wenn Sie ein Problem mit der realen Welt haben, bei dem der Speicher nicht rechtzeitig erfasst wird, zeigen Sie uns einen Code, der das Problem veranschaulicht. Ansonsten, entspannen Sie sich und lernen Sie die automatische Speicherregenerierung zu lieben.
Im Gegensatz zu C++ leben Objekte in Sprachen wie Java/C# nicht auf dem Stack; Nur Referenzen auf die Objekte, die Objekte selbst sind auf dem Heap. –