C#垃圾静态依赖

C#垃圾静态依赖,c#,garbage-collection,C#,Garbage Collection,当C#程序死亡时,类的静态属性也应该以某种形式被销毁 想象一下,一个类a的实例a是a的静态成员,一个类B的实例B是B的静态成员 现在,当程序终止时,需要收集并销毁A和B的静态成员。假设A.A在析构函数中使用来自B.B的信息,B.B在其析构函数中使用来自A.A的信息 你会得到一个循环依赖,在我们销毁/清理a和a.a之前,我们需要销毁/清理B和B.B,反之亦然。我用下面的代码尝试了这个。(Console.WriteLine自stdout get关闭后不工作) 现在我运行了这个程序,看到在我的例子中,

当C#程序死亡时,类的
静态属性也应该以某种形式被销毁

想象一下,一个类a的实例a是a的静态成员,一个类B的实例B是B的静态成员

现在,当程序终止时,需要收集并销毁A和B的静态成员。假设A.A在析构函数中使用来自B.B的信息,B.B在其析构函数中使用来自A.A的信息

你会得到一个循环依赖,在我们销毁/清理a和a.a之前,我们需要销毁/清理B和B.B,反之亦然。我用下面的代码尝试了这个。(Console.WriteLine自stdout get关闭后不工作)

现在我运行了这个程序,看到在我的例子中,B.B在A.A被销毁之前就被销毁了,但是B.B.done仍然可以从A.A访问,即使调用了析构函数

那么我的问题是,一个类/对象在被销毁后如何还能继续使用?C#如何知道何时可以重用/释放内存,因为即使不再有对对象的引用,它也不会重用内存

当C#程序死亡时,类的静态属性也应该 以这样或那样的形式被摧毁

如果这些是管理的,则将其留给CLR:)


.NET垃圾收集是基于“生成”的,因此对象可能由第0代收集进行垃圾收集,但尚未从内存中完全“销毁”或“删除”

请参阅:


如果你来自C++背景,记住“C++析构函数”等同于IDISPOSIGLE和AUDIFY()方法,这在一个使用块中经常使用。请参考msdn.microsoft.com/en-us/library/system.idisposable.aspx。您所说的析构函数是一个终结器,它与C++析构函数不同。

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");
    }
}