请参阅下面的代码。析构函数永远不会被调用。任何人都知道为什么以及如何纠正这个问题?
public partial class Form1 : Form
{
private Goo goo;
public Form1()
{
InitializeComponent();
goo = Goo.GetInstance();
}
}
public class Goo
{
private foo f = new foo();
private static Goo goo;
private Goo()
{}
public static Goo GetInstance()
{
if(goo!=null)
{
goo = new Goo();
}
return goo;
}
~Goo()
{
}
}
class foo
{
~foo()
{
}
}
答案 0 :(得分:8)
除非您清除(设置为null
)字段,否则静态字段引用的对象不会简单地完成 - 即使这样,它也是非确定性的并且无法保证。静态字段计为根对象。
何时(以及为什么)您希望收集/最终确定?它仍然可以访问...
答案 1 :(得分:2)
静态字段引用的对象总是可以访问的(假设没有类卸载或任何其他GC功能)并且永远不会被收集。
答案 2 :(得分:2)
即使您可能希望在进程关闭时静态对象上的终结器运行,但也不能保证:
答案 3 :(得分:1)
那不是析构函数。这是终结者。那是另一回事。正如其他两个人所说,因为这是一个静态的,它永远不会被收集,因此终结者永远不会运行。