2

请看下面的代码。析构函数永远不会被调用。任何人都知道为什么以及如何纠正这种情况?

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()
    {

    }
}
4

4 回答 4

8

静态字段引用的对象不会简单地最终确定,除非您清除(设置为null)该字段 - 即使这样它也是不确定的并且不能保证。静态字段算作根对象。

您希望何时(以及为什么)收集/完成此内容?它仍然可以访问...

于 2009-03-31T22:17:50.857 回答
2

静态字段引用的对象始终是可访问的(假设没有类卸载或任何其他 GC 时髦)并且永远不会被收集。

于 2009-03-31T22:17:51.433 回答
2

即使您可能希望在进程关闭时运行静态对象的终结器,但也不能保证:

于 2009-03-31T22:28:21.363 回答
1

那不是析构函数。这是一个终结者。那是另一回事。正如其他两个所说,因为这是一个静态的,它永远不会被收集,因此终结器永远不会运行。

于 2009-03-31T22:23:10.407 回答