2016-11-19 5 views
2

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.

Antwort

1

Wenn ein C# -Programm stirbt, sollten auch die statischen Eigenschaften der Klassen in der einen oder anderen Form zerstört werden.

Wenn diese verwaltet werden lassen, sie zu CLR :)


.NET Garbage Collection "Generation" basiert, so könnte ein Objekt Müll von einer Generation 0 Sammlung gesammelt werden, hat aber nicht gewesen vollständig aus dem Speicher "zerstört" oder "entfernt".

bitte hier beziehen: https://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/


Wenn Sie von C++ Hintergrund, bedenken Sie, dass "C++ destructor" zu IDisposable entspricht und die Dispose() -Methode, die oft in einem mit Block verwendet. Bitte verweisen Sie auf msdn.microsoft.com/en-us/library/system.idisposable.aspx. Was Sie als Destruktor bezeichnen, ist als Finalizer bekannt und unterscheidet sich von einem C++ - Destruktor.