У меня такой код:
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 ответа
Финализаторы не вызываются до возврата GC.Collect()
. Финализаторы запускаются в отдельном потоке - вы можете дождаться их, вызвав GC.WaitForPendingFinalizers()
.
Финализатор не вызывается во время сбора в вашем примере, потому что он все еще внедряется финализируемой очередью. Однако он запланирован для завершения, что означает, что он будет собран во время следующей сборки мусора.
Если вы хотите убедиться, что собраны экземпляры типов с финализатором, вам нужно сделать две таких коллекции.
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Но обычно не следует вызывать метод Collect()
самостоятельно.
Даже если вы попросите сборщик мусора, нет уверенности, что этот конкретный объект будет уничтожен (поскольку он не может быть в собираемом генерации в тот момент).
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.