Почему мой деструктор .net не вызывается в этом очень простом сценарии?

StackOverflow https://stackoverflow.com/questions/606524

Вопрос

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

 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");

    }

Я думал, что мой метод финализации будет вызван при моем вызове GC .Collect , но это не так.

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

Это было полезно?

Решение

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

Другие советы

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

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

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

Но, как правило, вам не следует вызывать Collect() применяйте метод самостоятельно.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top