8 Stimmen

Wie funktioniert die Garbage Collection bei Objektreferenzen?

Ich bin verwirrt über den Garbage Collection-Prozess für Objekte.

object A = new object();
object B = A;        
B.Dispose();

Durch einen Dispose-Aufruf nur für die Variable B wird das erstellte Objekt nicht in den Müll geworfen. da das Objekt immer noch von A referenziert wird.

Funktioniert der folgende Code genauso wie der obige?

public static image Test1()
{
    Bitmap A = new Bitmap();
    return A;
}

Jetzt rufe ich diese statische Funktion von einer anderen Methode aus auf.

public void TestB()
{
   Bitmap B = Test1();
   B.Dispose();
} 

Die statische Funktion Test1 gibt einen Verweis auf das Bitmap-Objekt zurück. Der Verweis wird gespeichert Die Referenz wird in einer anderen Variablen B gespeichert. Durch den Aufruf von Dispose für B wird die Verbindung zwischen B und dem Objekt unterbrochen, aber was geschieht mit der von Test1 übergebenen Referenz? Bleibt sie aktiv, bis der Anwendungsbereich der Funktion TestB beendet ist?

Gibt es eine Möglichkeit, die Referenz, die von der statischen Funktion übergeben wird, sofort zu entsorgen?

1voto

kemiller2002 Punkte 110605

Ok für den Anfang Dispose != Garbage Collected. Sie können dispose aufrufen, ohne dass es zu Garbage Collected wird, weil ein "Disposed Object" immer noch Referenzen auf es haben kann. Die dispose-Methode wird verwendet, um das Objekt "aufzuräumen", bevor der CG läuft (Schließen offener Datenbank- oder Dateiverbindungen usw.).

object A = new object();
object B = A;        
B.Dispose();

In diesem Fall ruft B.Dispose die Dispose-Methode von A auf, weil B auf das Objekt in der Variablen A verweist. Beide werden nicht CGd, weil sie noch nicht aus dem Anwendungsbereich gefallen sind.

public static image Test1()
{
    Bitmap A = new Bitmap();
    return A;
}

In diesem Fall erstellen Sie das Objekt A und geben es zurück. Wenn Sie also Test1 verlassen, wird A höchstwahrscheinlich von einer anderen Variablen in der aufrufenden Methode referenziert. Das bedeutet, dass, obwohl Sie die Methode verlassen haben, A (höchstwahrscheinlich) immer noch verwurzelt ist und erst dann CG'd wird, wenn die aufrufende Methode mit ihm fertig ist.

public void TestB()
{
   Bitmap B = Test1();
   B.Dispose();
} 

Hier wird B gerade erstellt und ruft dispose auf. Das bedeutet nicht, dass es abholbar ist. Sobald das Programm die Methode verlässt, fällt B aus dem Geltungsbereich, was bedeutet, dass es beim nächsten Aufruf der GC eingesammelt werden kann.

Wann zu verwenden Entsorgen

0voto

Jason Punkte 921

Es ist vielleicht erwähnenswert, dass der Aufruf von Dispose in Wirklichkeit gar nichts bewirkt. Er gibt dem Objekt die Möglichkeit, Ressourcen wie Datenbankverbindungen und nicht verwaltete Ressourcen aufzuräumen. Wenn Sie ein Objekt haben, das eine nicht verwaltete Ressource wie eine Datenbankverbindung enthält, teilt Dispose dem Objekt mit, dass es an der Zeit ist, diese Referenzen aufzuräumen.

Die grundlegende Frage bei der Garbage Collection lautet: "Kann dieses Objekt erreicht werden?" Solange sich ein Objekt auf dem Stack befindet, das einen Verweis auf Ihr Objekt hat (oder irgendwo in der Objekthierarchie ein Verweis auf dieses Objekt vorhanden ist), wird das Objekt nicht in die Garbage Collection aufgenommen.

Beispiel:

ObjA erzeugt ein ObjB, das wiederum ein ObjC erzeugt. Obj C wird erst dann gelöscht, wenn es nicht mehr von ObjB referenziert wird, oder wenn ObjB nicht mehr von ObjA referenziert wird, oder wenn es keine Objekte mehr gibt, die eine Referenz auf ObjA enthalten.

Die Frage, die man sich stellen muss, ist: "Kann dieses Objekt derzeit von irgendetwas im Code referenziert werden?"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X