9

C# では、Documentationに記載されているように、この素​​敵な投稿の受け入れられた回答では、クラスは親クラスのデストラクタを継承しないと述べられています。

質問: 基本クラスのプライベート要素を確実に破棄したい場合、すべての子クラスに IDisposable を実装し、Dispose メソッドで base.Dispose() を呼び出す適切な方法はありますか?

そうしても問題ないように見えますが、すべての子クラスでの実装を必要としない方法をお勧めします。

4

4 に答える 4

16

MSDNは、デストラクタが基本クラスで自動的に呼び出されると述べています。

于 2011-04-20T14:52:31.540 に答える
7

ここでは、使い捨てパターンに従う必要があります。継承にも対応しています。

ここで興味深いのは、「デストラクタは継承しない」ということですが、どうすればよいかわかりません。ちょっとしたテストを書きましたが、基本クラスにデストラクタを書くだけでいいので安心です。

したがって、子は基本クラスの管理されていないリソースから切り離されます。Dispose(bool)彼らは自分たちの問題を片付けるために上書きすることができます。

しかし、マネージ リソースを処理するためだけに完全なパターンを実装しているプログラマーが多すぎるのでコメントしました。

一般的な設計の観点からは、Disposable クラスはシールされたほうがよいでしょう。

于 2011-04-20T15:23:03.317 に答える
0

基本クラスは、基本クラスに標準の IDisposable パターンを使用する必要があります。この方法では、基本クラスのみがファイナライザーを必要とし、派生クラスは単純に仮想メソッドをオーバーライドします。

protected void Dispose(bool disposing)
于 2011-04-20T15:25:45.067 に答える
0

親クラスが Microsoft の IDisposable パターンを使用する場合、子クラスは Dispose(void) をオーバーライドするのではなく、Dispose(Boolean Disposing) をオーバーライドする必要があります。Disposing true で呼び出された場合、子クラスを破棄し、base.Dispose(True) を呼び出す必要があります。Disposing false で呼び出された場合、ほとんどの場合、base.Dispose(False) を呼び出す以外に何もすべきではありません。

ほとんどの場合、base.Dispose(False) への呼び出しは何も行いませんが、とにかく行う必要があることに注意してください。子クラスが追加の「管理されていないリソース」を追加する必要がある場合 (つまり、ファイナライザーで実行する必要がある追加の責任がある場合)、通常、それらの責任を別のオブジェクトにカプセル化する必要があります。クラスにファイナライザーがあるかどうかの問題は、単なる「実装の詳細」ではないことに注意してください。基本クラスにファイナライザーを追加することは重大な変更になる可能性があり、プログラムがリソースをリークする可能性があります (プログラムが一度に長時間実行されない場合は、悪いが、おそらく生き残ることができます)。 、まだ使用中のリソースのクリーンアップを試みます (問題が発生することはあまりありませんが、まれにすぐに障害が発生する可能性があります)。

于 2011-04-20T15:29:11.157 に答える