Question

S'il vous plaît voir le code ci-dessous. Les Destructeurs ne sont jamais appelés. Quelqu'un sait pourquoi et comment cela peut être corrigé?

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

    }
}
Était-ce utile?

La solution

Objets référencés par les champs statiques ne sont pas simplement mis au point à moins que vous ne videz pas (mis à null) le terrain - et même alors, il est non déterministe et non garantie. Les champs statiques comme des objets comptent racine.

Quand (et pourquoi) vous attendez-vous ce à collecter / finalisé? Il est toujours accessible ...

Autres conseils

Objets référencés par les champs statiques sont toujours accessibles (en supposant qu'aucun déchargement de classe ou tout autre GC funkiness) et ne seront jamais recueillies.

Même si vous attendez le finaliseur sur les objets statiques à exécuter lorsque le processus est arrêté, il n'y a aucune garantie il soit:

Ce n'est pas un destructor. Il est un finaliseur. C'est une autre chose. Comme les deux autres ont dit, parce que c'est statique, il ne sera jamais collecté, d'où le finaliseur ne fonctionnera jamais.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top