2012-12-30 2 views
9

状況:デストラクタでオブジェクトへの参照を作成するとどうなりますか?

  1. オブジェクトがGCコレクション
  2. GCは、私は、例えば、静的なコレクションに現在のオブジェクトを追加し

デストラクタではデストラクタ

  • を呼び出しを開始GC
  • の対象となり、収集オブジェクトのプロセスがGCに対して不適格となり、将来適格となる予定ですが、仕様ではFinalizeを1回しか呼び出せないと述べています。

    質問:

    1. が破壊されることは、オブジェクトのでしょうか?
    2. は、次のGCでファイナライズされますか?
  • +1

    .NET GC復活のために検索を行うには、例えば見つけます[この記事](http://msdn.microsoft.com/en-us/magazine/bb985010.aspx) –

    答えて

    12

    オブジェクトがは、ごみ収集されません - しかし、あなたはGC.ReRegisterForFinalizeを呼び出さない限り、それはガベージコレクションの対象です次回は、ファイナライザは、再実行されることはありません。

    サンプルコード:

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

    出力:

    First collection... 
    Finalizer count: 1 
    Second collection (nothing to collect) 
    Third collection (cleared static variable) 
    Finalizer count: 2 
    Fourth collection (no more finalization...) 
    
    関連する問題