C#垃圾静态依赖
当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关闭后不工作) 现在我运行了这个程序,看到在我的例子中,
静态属性也应该以某种形式被销毁
想象一下,一个类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");
}
}