이 간단한 시나리오에서 .NET Destructor가 전화하지 않은 이유는 무엇입니까?
-
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가 수집하도록 요청하더라도,이 특정 대상이 파괴 될지 확신 할 수 없다 (그 순간에 수집 된 세대에있을 수 없기 때문에).
제휴하지 않습니다 StackOverflow