1

私のプロジェクトには多くのリーダーとライターのクラスがあります。IDisposableの実装を開始しましたが、クラスに多くの定型コードが追加されると思います。クラスごとに、以下を実装する必要があります。

  • デストラクタ。
  • Dispose()メソッド。
  • Dispose(bool disposed)メソッド。
  • 「booldisposed」フィールド。
  • オブジェクトがすべてのパブリックメソッドにすでに配置されているかどうかを確認するためのチェック。
  • ドキュメント(ドキュメントフラグを有効にしていて、コンパイラがそれ以外の場合は警告するため)。

私の質問:

IDisposableを実装する価値はありますか?以前は、次のようなクラスを使用していました。

using (Stream s = File.OpenRead("myfile.bin"))
    x = new SomethingReader(s).ReadSomething();

IDisposableを使用すると、あまり改善されません。

using (SomethingReader r = new SomethingReader(File.OpenRead("myfile.bin")))
    x = r.ReadSomething();

Dispose()メソッドのみを実装できますか?

私のクラスは管理されていないリソースを使用しないため、Dispose(false)は何もしません。クリーニングしているものもIDisposableであるため、オブジェクトが破棄された後にメソッドを呼び出すと、既に破棄されたオブジェクトを使用しているため、ObjectDisposedExceptionがスローされるはずです。

完全なIDisposableパターンを実装することをお勧めする場合、ボイラープレートコードを減らす方法はありますか?

編集:いくつかの回答はクラスを封印することを推奨しているので、実際には、クラスを封印することで問題がないことを確認できます。

4

4 に答える 4

2

管理されていないリソースを直接保持していない場合(つまり、SafeHandleでさえ直接保持していない場合)、一般的には次のようになります。

  • ファイナライザーを実装しないでください
  • Dispose(bool)を実装しないでください
  • クラスを封印済みとしてマークしてください。

何年もの間、IDisposeの広く配布されているすべてのドキュメントが、相互運用ライブラリを作成する人々(つまり、.NET Frameworkの作成者自身)を対象としており、他のすべての人のはるかに一般的な使用パターンを完全に無視していたことは非常に残念です。

状況が改善され、封印されたタイプのfxcop(VS Code Analysis)によって認識されるより軽量なパターンがあります:http: //msdn.microsoft.com/en-us/library/ms244737%28VS.80%29.aspx

于 2010-07-30T15:14:39.390 に答える
1

アンマネージ リソースを使用していない場合は、完全なパターンを実装する必要はありません。ただし、パターンには 1 つの側面の利点があります。誰かがあなたのクラスを拡張したい場合は、オーバーライドDispose(bool)して呼び出しbase.Dispose(true)て、すべてのリソースが確実に破棄されるようにすることができます。

于 2010-07-30T15:06:00.920 に答える
0

別の基本クラスが必要ないと仮定して、コンポーネントから継承できます。ただし、特別なことを何もしていない場合は、Disposeメソッドを使用できます。ChaosPandion指摘したように、これが問題を引き起こす可能性があるのは、他の誰かが後でクラスを拡張しようとするため、実装を封印したい場合があるためです。

于 2010-07-30T15:15:03.517 に答える
0

誰かが Dispose(boolean) をオーバーライドしてクラスを拡張しようとしていて、それを実装していない場合、それは失敗します。しかし、Dispose() をオーバーライドしようとすると、うまくいきます。子孫クラスが管理されていないリソースを直接制御することを期待しない場合、クラスを封印する必要がある理由はわかりません。

于 2010-07-30T16:24:36.473 に答える