2012-12-30 14 views
9

Situazione:Cosa succede se nel distruttore creo un riferimento vivo a un oggetto?

  1. oggetto diventa ammissibile per GC
  2. GC inizia la raccolta
  3. chiamate GC distruttore
  4. In distruttore Io, per esempio, aggiungo oggetto corrente per la raccolta statica

In il processo di raccolta dell'oggetto diventa non idoneo per GC e sarà ammissibile in futuro, ma nelle specifiche ha dichiarato che Finalize può essere chiamato una sola volta.

Domande:

  1. obietterà distrutti?
  2. verrà chiamato al prossimo GC?
+1

fare una ricerca per NET GC Resurrezione, troverete ad esempio [questo articolo] (http://msdn.microsoft.com/en-us/magazine/bb985010.aspx) –

risposta

12

l'oggetto verrà non essere garbage collection - ma la prossima volta che è idoneo per la raccolta dei rifiuti, il finalizzatore non sarà essere eseguito ancora una volta, a meno che non si chiama GC.ReRegisterForFinalize.

codice di esempio:

using System; 

class Test 
{ 
    static Test test; 

    private int count = 0; 

    ~Test() 
    { 
     count++; 
     Console.WriteLine("Finalizer count: {0}", count); 
     if (count == 1) 
     { 
      GC.ReRegisterForFinalize(this); 
     } 
     test = this; 
    } 

    static void Main() 
    { 
     new Test(); 
     Console.WriteLine("First collection..."); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 

     Console.WriteLine("Second collection (nothing to collect)"); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 

     Test.test = null; 
     Console.WriteLine("Third collection (cleared static variable)"); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 

     Test.test = null; 
     Console.WriteLine("Fourth collection (no more finalization...)"); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
    } 
} 

uscita:

First collection... 
Finalizer count: 1 
Second collection (nothing to collect) 
Third collection (cleared static variable) 
Finalizer count: 2 
Fourth collection (no more finalization...) 
Problemi correlati