Wenn ein C# -Programm stirbt, sollten die static
Eigenschaften von Klassen auch in der einen oder anderen Form zerstört werden.C# statische Abhängigkeiten von Müll
Stellen, eine Klasse A, mit einer Instanz einer als ein statisches Element von A und der Klasse B mit einer Instanz b als statisches Element von B
Nun, wenn das Programm beenden, die statischen Elemente von A und B müssen gesammelt und zerstört werden. Stellen Sie sich jetzt vor, dass A.a Informationen aus B.b im Destruktor verwendet und B.b Informationen von A.a in seinem Destruktor verwendet.
Sie würden eine zyklische Abhängigkeit erhalten, bevor wir A und A.a zerstören/reinigen können, müssen wir B und Bb zerstören und reinigen und umgekehrt. Ich habe das mit dem folgenden Code versucht. (Console.WriteLine funktioniert nicht, da stdout gets geschlossen)
class A
{
private static A a = new A();
public bool done = false;
private A(){}
~A()
{
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true);
GC.WaitForPendingFinalizers();
System.IO.File.WriteAllText(@"a.txt", "A got destroyed, b:" + (B.getB().done ? "destroyed" : "intact"));
done = true;
}
public static A getA() { return a; }
}
class B
{
private static B b = new B();
public bool done = false;
private B(){}
~B()
{
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true);
GC.WaitForPendingFinalizers();
System.IO.File.WriteAllText(@"b.txt", "B got destroyed, a:" + (A.getA().done ? "destroyed" : "intact"));
done = true;
}
public static B getB() { return b; }
}
public class Program
{
public static void ensureInstances() {A.getA(); B.getB();}
public static void Main(string[] args)
{
ensureInstances();
Console.WriteLine("Time to die");
}
}
Jetzt habe ich lief dies und sah, dass in meinem Fall Bb vor Aa zerstört wird zerstört, aber Bbdone ist nach wie vor erreichbar von Aa selbst nachdem es Destruktor ist aufgerufen.
Meine Frage dann, wie kann eine Klasse/ein Objekt immer noch verwendet werden, nachdem sie zerstört wurde? Und wie weiß C#, wann der Speicher wiederverwendet werden kann, da er den Speicher nicht wiederverwendete, obwohl es keine Referenzen mehr auf das Objekt gab.