Pregunta

Por favor, véase el código de abajo. Los destructores no son llamados. Alguien sabe por qué y cómo esto puede ser rectificado?

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

    }
}
¿Fue útil?

Solución

Los objetos referenciados por los campos estáticos no se han finalizado, simplemente, a menos que se borre (ajustado a null) el campo - e incluso entonces no es determinista y no está garantizada. Los campos estáticos cuentan como objetos raíz.

Cuando (y por qué) se puede esperar que esto sea recogido / finalizado? Todavía es accesible ...

Otros consejos

Objetos referenciados por los campos estáticos son siempre alcanzable (suponiendo que no hay descarga de clase o cualquier otra funkiness GC) y nunca serán recogidos.

A pesar de que se podría esperar el finalizador de objetos estáticos para funcionar cuando el proceso está apagado, no hay garantías de allí tampoco:

Eso no es un destructor. Es un finalizador. Eso es una cosa diferente. Como los otros dos han dicho, porque este es un estático, nunca ser recogida, de ahí el finalizador no se ejecutará.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top