2011-12-21 9 views
0

の場合、DisposeメソッドでGC.SupressFinalizer()を呼び出すと、 はすべてのインスタンスメンバにnullを割り当てて、それらをクリーンアップする必要があります。 ?例えばIDisposableパターン:GC.SupressFinalizer

class test : IDisposable 
{ 
    public int a = 10; 
    public int b = 20; 
    public int c = 39; 

    private bool is_disposed = false; 

    Dispose(bool shall_dispose) 
    { 
     if(!is_disposed && shall_dispose) 
     { 
      is_disposed = true; 

      // shall I annulate a, b & c or they will be freed anyway?? 
      // a = null; ?, integers aint nullable 
      // b = null; ? 
      // c = null; ? 

      // or primitive types should't be annulated? only reference(heap) types? 
     } 
    } 

    Dispose() 
    { 
     Dispose(true); 
    } 

    ~test() 
    { 
     Dispose(false); 
    } 
} 

答えて

2

GC.SupressFinalizerは()、それはもはや到達可能であるときに収集されてからオブジェクトを停止しないではないだろう、それだけで、オブジェクトのファイナライザへの呼び出しをSUPRESSます。そのため、オブジェクトとそのメンバーの両方が収集されます。

+0

ありがとうございました。これは、とにかくGCが実行され、オブジェクトをクリーンアップすることを意味しますが、デストラクタ呼び出しは行われません。右 ? – Alex

+0

正確にはどういう意味ですか –

1

IDisposable.Disposeの目的は、それがもはや必要ではないことをオブジェクトに通知することであり、他のオブジェクトにもはやそのために何もする必要がないことを伝える必要があります(例えば、ファイルを開いたままにする、メモリブロックへの排他的アクセスなど)ほとんどの場合、オブジェクトがDisposeされた直後に、そのオブジェクトへの参照はすべて破棄され、オブジェクトはガベージコレクションの対象となり、他のオブジェクトへの参照はガベージコレクションを遅らせることはありません。それにもかかわらず、他の参考文献をクリアすることは良い考えです。 Disposeが呼び出されてから長い間、参照がオブジェクトに残っている可能性があります。さらに、IDisposableオブジェクトがガベージコレクタの第2世代に到達するのに十分な長さであった可能性があります。つまり、ガベージコレクタがもう一度それを参照することもあります。より最近作成されたオブジェクトへの参照が保持されている場合、その参照をnullに設定すると、そうでない場合よりも早くオブジェクトを収集できます。

関連する問題