Почему мой деструктор .net не вызывается в этом очень простом сценарии?
-
03-07-2019 - |
Вопрос
У меня есть следующий код :
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, нет уверенности, что этот конкретный объект будет уничтожен (поскольку его не могло быть в поколении, собираемом в данный момент)