C#プログラムが終了すると、クラスのstatic
プロパティも1つの形式で破棄する必要があります。C#のガベージの静的依存関係
B
今Bの静的メンバとしてAの静的メンバとインスタンスとクラスBのようなインスタンスで、クラスAを想像してプログラムを終了するとき、Aの静的メンバとBを収集して破壊する必要があります。 A.aはデストラクタでB.bの情報を使用し、B.bはデストラクタでA.aの情報を使用するとします。
私たちはAとAを破壊/清掃する前に、BとB.bを破壊/清掃する必要があります。私は以下のコードでこれを試しました。
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");
}
}
は今、私はこれを実行したとAAが破壊される前に、私の場合にはBbのが破壊されます、ということを見たが、BbdoneもまだAaとからアクセス可能でありました(STDOUT取得者が閉じ以来Console.WriteLineをは動作しません)それがデストラクタの後に呼ばれます。
私の質問では、クラス/オブジェクトはどのように破壊された後でも使用できますか? C#では、オブジェクトへの参照がなくてもメモリを再利用しなかったので、メモリをいつ再利用/解放できるかをどのように知っていますか?