Статический экземпляр, desctructor никогда не вызывается - PullRequest
2 голосов
/ 01 апреля 2009

Пожалуйста, смотрите код ниже. Деструкторы никогда не называются. Кто-нибудь знает, почему и как это можно исправить?

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 ]

8 голосов
/ 01 апреля 2009

Объекты, на которые ссылаются статические поля, не просто завершаются, пока вы не очистите (установите на null) поле - и даже в этом случае оно недетерминировано и не гарантируется. Статические поля считаются корневыми объектами.

Когда (и почему) вы ожидаете, что это будет собрано / завершено? Это все еще доступно ...

2 голосов
/ 01 апреля 2009

Даже если вы ожидаете, что финализатор на статических объектах будет запускаться при завершении процесса, там также нет никаких гарантий:

2 голосов
/ 01 апреля 2009

Объекты, на которые ссылаются статические поля, всегда достижимы (при условии, что классы не выгружаются или нет каких-либо других действий GC) и никогда не будут собраны.

1 голос
/ 01 апреля 2009

Это не деструктор. Это финализатор. Это другая вещь. Как сказали двое других, поскольку это статический объект, он никогда не будет собран, поэтому финализатор никогда не запустится.

...