2012-04-20 13 views
2

カスタムオブジェクトは、管理対象オブジェクトのみを含む場合でも破棄する必要がありますか?たとえば、いくつかの文字列とxmldocumentの型だけでなく、いくつかのListオブジェクトを含むカスタムクラスがあります。私は独自のDisposeメソッド(IDisposableから継承しないで)を作成し、それらが空であることを確認するためにそれらをクリアする必要がありますか?私がすれば、私もIDisposableから継承する必要がありますか?カスタムオブジェクトの廃棄

+0

「必要」は強い言葉です。大規模で扱いにくい場合や、重要な限られたリソースを占める場合は、これらのリソースを解放するためのIDisposableを実装することをお勧めします。 –

+0

FAQの回答は、IDisposabeの全体的な使用方法と[IDisposableインターフェイスの適切な使用方法](http://stackoverflow.com/questions/538060/proper-use-of-the-idisposable-interface)を読む価値があります。 –

+0

@JeremyHolovacs - "big"はここでは関係ありません。それはメモリに関するものではありません。約(管理された)リソースのみ –

答えて

6

これらの管理対象オブジェクトの1つ以上がIDisposableから継承する場合のみ。

IDisposableオブジェクト(別名管理対象リソース)がある場合は、IDisposableを実装しますが、ではなく、デストラクタ/ファイナライザを追加します。

+0

もしそうなら、カスタムクラスにIDisposableも実装します。 – phoog

+0

@HenkHoltermanデストラクタ/ファイナライザは、〜[MyCustomClassName]メソッドですか? – ganders

+0

@ganders - はい。 –

2

基準の管理対象オブジェクトインスタンスのいずれかがIDisposableを実装している場合は、大まかにはIDisposableを実装する必要があります。その後、あなたのDispose実装にそれらを破棄することができます。

0

あなたのオブジェクトの寿命の末尾にあるnullへの参照を設定すると、ガーベッジコレクタの内容は変更されません。含まれているオブジェクトへの残りの参照のみがカスタムオブジェクトからのものである場合、ガベージコレクタはガベージコレクションの対象として扱います(生きたオブジェクトからの参照のみを参照するため)。他の場所からの参照がある場合、参照をクリーンアップしても、含まれているオブジェクトは収集されません。

もちろん、含まれているオブジェクトの一部に明示的な処理が必要な場合、つまりIDisposableが実装されている場合、または末尾に閉じられる必要がある場合があります(IDisposableを実装するには正しい方法ですが)。このようにしてIDisposableを自分で実装し、含まれているオブジェクトをDisposeに処分する必要があります。

はもちろん、あなたが管理対象外オブジェクトを参照するとき特別な方法でIDisposableを実装する必要があるが、これはanother storyです。

関連する問題