所有権や破棄可能権のないオブジェクトを Dispose できない
これは、IDisposable はオブジェクトの寿命を管理するための機能・主張であって、使用を管理するための機能ではないことを知っておかなければ危険であることも示します。
someMethod( IDisposable obj) { // : obj.Dispose(); }
someMethod() が Dispose() を呼び出していますが、このような呼び出しが許されるのは非常に稀で、通常はメソッドはオブジェクトの破棄を行いません。多くの場合、このような実装はコーディングミスであり、バグです。もっと危険な例は C# の using() 構文です。
someMethod( IDisposable obj) { using(obj) { // : } }
using() は IDisposable とセットで使うことができる便利な構文ですが、その using という名前とは異なり Dispose() の呼び出しを含んでいます。
ここで提案できる using() に関する唯一のガイドラインは、オブジェクトの完全な寿命を using() で定義するということです。
using(object obj = new Foo()) { // : }
using() はこのように、オブジェクトの生成と共に扱われるように記述しよう、ということです。このような記述ができない場合は using() を使うべきではないと考えています。
- id:ladybug:20040111 へ続きます。