2012-12-30 15 views
9

Durum:Ya yıkıcıda bir nesneye canlı bir referans oluşturursam ne olur?

  1. Nesne GC için uygun hale gelir
  2. GC toplama
  3. GC çağrıları ben, örneğin, statik koleksiyonu

geçerli nesne ekleyin yıkıcı ilgili olarak

  • yıkıcıyı başlar Toplama nesnesi süreci, GC için uygun değildir ve gelecekte de uygun olacaktır, ancak belirtimde, Finalize'nin yalnızca bir kez çağrılabileceğini belirtmiştir.

    Sorular:

    1. imha edilecek nesne olacak?
    2. bir sonraki GC'de son haline getirilecek mi?
  • +1

    NET GC Diriliş için bir arama yapın, siz mesela bulacaksınız [bu makale] (http://msdn.microsoft.com/en-us/magazine/bb985010.aspx) –

    cevap

    12

    nesne olacak değil olmak çöp toplanan - ama GC.ReRegisterForFinalize çağrı sürece çöp toplama işlemi için uygun olduğu bir sonraki sefer, sonlandırıcı , yeniden aday olmayacak.

    örnek kod:

    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(); 
        } 
    } 
    

    Çıktı:

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