ガベージコレクタの弊害

C++ではオブジェクトの寿命を完全にコントロールできる。そのため必ず行わなければならない処理はデストラクタで行うというテクニックが有効だった。

ところがC#ではガベージコレクタが導入されたためオブジェクトの寿命がコントロールできなくなった。
つまりある関数で使用しているローカル変数が、関数終了後も行き続ける可能性があることを示している。

そのため下記のようなコードを書かざるを得ない場合がある

public void Function() {
  Hoge object = null ;
  try {
    object = new Hoge() ;
    ...
  } 
  finally {
    if( object != null ) { object.Dispose() ;}
    // もしくは object.Finalize() ;
  }
}

...ださいぜ!



追記(2006/07/24)

using( Hoge hoge = ... )
{
    ....
}

と書いておけばスコープアウトのタイミングでhoge.Dispose()が呼ばれる。
HogeがSystem.IDisposableにアップキャストできない場合はコンパイルエラーとなる。
またhoge==nullの場合はhoge.Dispose()は呼ばれない。