gpt4 book ai didi

C# 垃圾静态依赖

转载 作者:太空宇宙 更新时间:2023-11-03 12:36:39 24 4
gpt4 key购买 nike

当 C# 程序终止时,类的 static 属性也应该以一种或另一种形式销毁。

想象一下,一个类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 已关闭)

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

现在我运行了它并看到,在我的例子中,B.b 在 A.a 被销毁之前被销毁,但是 B.b.done 仍然可以从 A.a 访问,即使在它的析构函数被调用之后也是如此。

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

最佳答案

When a C# program dies, the static properties of classes should also be destroyed in one form or another.

如果这些是托管的,则将它们留给 CLR :)


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

请引用:https://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/


如果您有 C++ 背景,请记住“C++ 析构函数”等同于 IDisposable 和 Dispose() 方法,通常在 using block 中使用。请引用 msdn.microsoft.com/en-us/library/system.idisposable.aspx。您所说的析构函数称为终结器,它与 C++ 析构函数不同。

关于C# 垃圾静态依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40695630/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com