Почему мой деструктор .net не вызывается в этом очень простом сценарии? - PullRequest
2 голосов
/ 03 марта 2009

У меня есть следующий код:

 public class A
    {
        ~A()
        {
            Console.WriteLine("destructor");
        }
    }

 public static A Aref;
 static void Main(string[] args)
    {
        Aref = new A();
        int gen = GC.GetGeneration(Aref);
        Aref = null;
        GC.Collect(gen, GCCollectionMode.Forced);
        Console.WriteLine("GC done");

    }

Я думал, что мой метод Finalizer будет вызван после моего вызова GC.Collect, а это не так.

Может кто-нибудь объяснить мне, почему?

Ответы [ 3 ]

13 голосов
/ 03 марта 2009

Финализаторы не вызываются до возврата GC.Collect(). Финализаторы запускаются в отдельном потоке - вы можете подождать их, вызвав GC.WaitForPendingFinalizers().

6 голосов
/ 03 марта 2009

Финализатор не вызывается во время сбора в вашем примере, потому что он все еще находится в корне в финализируемой очереди. Однако он запланирован для финализации, что означает, что он будет собран во время следующей сборки мусора.

Если вы хотите убедиться, что экземпляры типов с финализатором собраны, вам нужно сделать две коллекции, подобные этой.

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

Но обычно вы не должны вызывать метод Collect() самостоятельно.

0 голосов
/ 03 марта 2009

Даже если вы попросите сборщик мусора, вы не уверены, что этот конкретный объект будет уничтожен (как это не могло быть при сборе поколения в этот момент)

...