2009-03-31 5 views
2

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

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

    } 
} 

ответ

8

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

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

2

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

1

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

+0

Почему dtor/finalizer отличается? C# dtor отображается в Finalize, правильно? –

+0

деструктор и финализатор - оба условия были использованы взаимозаменяемо в официальной документации. Используемое слово не влияет на поведение ... –

+0

@Marc: Я никогда не видел, чтобы это называлось деструктором. Можете ли вы ответить ссылкой, которая делает это? –

2

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