Disposeの実装

Disposeの役目はなんでしょうか?マニュアルを見ても良く書かれてないように思います。ここでは、一般的な解釈を述べます。

.NET Framework 全体で考え方が統一されているかは別として、Disposeという言葉を聞くようになったのは、ガベージコレクタを使った言語です。

まずはDisposeの英語としての意味をおさらいしましょう。ここでは「処分する」が適切です。使わなくなったオブジェクトは「処分する」必要があります。じゃあ、ガベージコレクタは、何時処分すればいいのでしょうか?

そのヒントを与えるメソッドがDisposeです。




Disposeの実装は3大原則があります。

  • 複数の所有者によって参照されるオブジェクトにはDisposeが必要
  • あるオブジェクトがDisposeを実装する場合、自分が所有者となってるオブジェクトを全て開放する必要がある
  • 複数の開放に備える

1番目の原則は相互参照や循環参照の問題への対処です。Disposeというメソッドの必要性はここにあります。

オブジェクトに唯一の所有者がいるならば、所有者が破棄されるときに同時に破壊すれば良いだけです。対して、オブジェクトに複数の所有者が居る場合、参照カウントで開放のタイミングを決めるのが一般的(.NETもそう)ですが、相互参照や循環参照でカウントが0にならない場合が存在します。

その対策に、オブジェクトの破棄権限者(観察者の意味でオブサーバと言われる)を決め、その人に責任持って処分(Dispose)してもらいます。逆からいうと、相互参照も循環参照もされない場合、Disposeの実装は不要だと思います。

2番目の原則は説明する必要はがないでしょう。

3番目の原則はMSDNにもしつこいくらい書いてあります。破棄できる人が複数だったり、マルチスレッド等で同時に呼ばれた時に対策する必要があります。破棄されてる最中の参照も防止する必要があります。

この話は、MSDNのどこにもハッキリした文献がない上、アンマネージオブジェクトがどうこうとか、誤解を招く表現はやめてほしいです。

Leave a Reply

最初のコメントを頂けますか?

更新通知を受け取る »
avatar
wpDiscuz