Frage

Bitte beachten Sie den Code unten.Die Destruktoren werden nie aufgerufen.Weiß jemand warum und wie man das beheben kann?

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

    }
}
War es hilfreich?

Lösung

Objekte durch statische Felder referenziert werden, nicht nur abgeschlossen, wenn Sie klar das Feld (auf null) - und selbst dann ist es nicht deterministisch und nicht garantiert. Statische Felder gelten als Stammobjekte.

Wenn (und warum) würden Sie erwarten, dass diese gesammelt / abgeschlossen werden? Es ist immer noch zugänglich ...

Andere Tipps

Objekte, auf die durch statische Felder verwiesen wird, sind immer erreichbar (vorausgesetzt, es erfolgt kein Entladen der Klasse oder eine andere GC-Funkie) und werden niemals erfasst.

Auch wenn Sie die Finalizerthread auf statische Objekte erwarten könnte zu laufen, wenn der Prozess heruntergefahren wird, gibt es keine Garantien gibt entweder:

Das ist kein destructor. Es ist ein Finalizerthread. Das ist eine andere Sache. Wie die beiden anderen gesagt haben, denn dies ist ein statisch ist, wird es nie damit gesammelt, werden die Finalizerthread nie ausgeführt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top