Perché il mio distruttore .net non viene chiamato in questo scenario molto semplice?
-
03-07-2019 - |
Domanda
Ho il seguente codice:
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");
}
Ho pensato che il mio metodo Finalizer sarebbe stato chiamato alla mia chiamata a GC.Collect, che non è il caso.
Qualcuno può spiegarmi perché?
Soluzione
I finalizzatori non vengono chiamati prima della restituzione di GC.Collect ()
. I finalizzatori vengono eseguiti in un thread separato: puoi aspettarli chiamando GC.WaitForPendingFinalizers ()
.
Altri suggerimenti
Il finalizzatore non viene chiamato durante la raccolta nell'esempio, poiché è ancora rootato dalla coda finalizzabile. Tuttavia è prevista la finalizzazione, il che significa che verrà raccolta durante la prossima raccolta dei rifiuti.
Se vuoi assicurarti che vengano raccolte istanze di tipi con un finalizzatore devi fare due raccolte come questa.
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Ma generalmente non dovresti chiamare tu stesso il metodo Collect ()
.
Anche se chiedi la raccolta da parte del GC, non è sicuro che questo specifico oggetto verrà distrutto (in quanto non potrebbe essere nella generazione raccolta in quel momento)