終了処理

ファイナライザを使用しない方が良い理由。

  • ファイナライザが呼び出されるタイミングを制御できない。また呼び出されないこともある。
  • 複数のオブジェクトのファイナライザが呼び出される順番は予測できない。
  • ファイナライザを持つオブジェクトがほかのオブジェクトを参照している場合、参照先のオブジェクトの寿命が不要に引き延ばされる。
  • ファイナライザを持つオブジェクトは、マネージヒープに割り当てる際に時間がかかる。

サンプルコード

class Example : System.IDisposable
{
    private bool disposed = false;

    ~Example()
    {
        Dispose( false );
    }

    public void Dispose()
    {
        Dispose( true );

        // このインスタンスのファイナライザが呼び出されないようにする
        System.GC.SuppressFinalize( this );
    }

    private void Dispose( bool disposing )
    {
        if( !this.disposed )
        {
            if( disposing )
            {
                // マネージ リソースを解放する
            }

            // アンマネージ リソースを解放する

            this.disposed = true;
        }
    }
}
IDisposable インターフェイス (System) - MSDN
GC.SuppressFinalize メソッド (System) - MSDN