2009-03-31 11 views
2

Siehe Code unten. Die Destruktoren werden niemals aufgerufen. Wer weiß warum und wie kann das behoben werden?Statische Instanz, Descruktor nie aufgerufen

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

    } 
} 

Antwort

8

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

Wann (und warum) würden Sie erwarten, dass dies gesammelt/abgeschlossen wird? Es ist immer noch zugänglich ...

2

Objekte referenziert durch statische Felder sind immer erreichbar (keine Klasse Entladen oder anderen GC Funkiness vorausgesetzt) ​​und werden nie gesammelt werden.

1

Das ist kein Destruktor. Es ist ein Finalizer. Das ist eine andere Sache. Wie die anderen beiden schon gesagt haben, wird es niemals gesammelt werden, da es sich um eine statische Datei handelt. Daher wird der Finalizer niemals ausgeführt.

+0

Warum ist dtor/Finalizerthread anders? Ein C# dtor ist Finalize zugeordnet, oder? –

+0

destructor und Finalizerthread - beide Begriffe wurden austauschbar in offiziellen Dokumenten verwendet. Das Wort verwendet das Verhalten nicht beeinflussen ... –

+0

@Marc: Ich habe es nie einen destructor genannt gesehen. Können Sie mit einem entsprechenden Link antworten? –

2

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