管理オブジェクトしか含まれていない場合でも、カスタム オブジェクトを破棄する必要がありますか? たとえば、いくつかの List オブジェクトと、いくつかの string および xmldocument タイプを含むカスタム クラスがあります。独自の Dispose メソッドを作成し (IDisposable から継承するのではなく)、それらをクリアして空であることを確認する必要がありますか? 必要であれば、IDisposable からも継承する必要がありますか?
3 に答える
これらの管理対象オブジェクトの1つ以上がIDisposableから継承する場合のみ。
IDisposableオブジェクト(管理対象リソース)がある場合は、IDisposableを実装しますが、デストラクタ/ファイナライザを追加しないでください。
経験則として、IDisposable
参照する管理対象オブジェクトインスタンスのいずれかが実装する場合は実装する必要がありますIDisposable
。その後、実装でそれらを破棄できますDispose
。
null
ご覧のとおり、オブジェクトの有効期間の終わりに参照を設定しても、ガベージ コレクターは何も変更されません。含まれているオブジェクトへの残りの参照がカスタム オブジェクトからのものだけである場合、ガベージ コレクターはそれらをガベージ コレクションの対象として扱います (生きているオブジェクトからの参照のみを探すため)。他の場所からの参照がある場合、参照をクリーンアップしても、含まれているオブジェクトは収集されません。
もちろん、別の話は、含まれているオブジェクトの一部が明示的な破棄を必要とする場合、つまり、を実装するIDisposable
か、有効期間の終わりに閉じる必要がある場合です (ただし、正しい方法はとにかく実装することですIDisposable
)。IDisposable
自分で実装し、含まれているオブジェクトを破棄する必要がありますDispose
。
もちろん、アンマネージドオブジェクトIDisposable
を参照する場合は特別な方法で実装する必要がありますが、これは別の話です。