3

IDisposableからDisposeを実装する必要があるのはなぜですか。アンマネージリソースを解放するメソッドをクラスに実装した場合はどうなりますか?

私が話す人々は、私がそうしなければならないと言っている理由を知っているふりをします。

正直なところ、これは、一部の開発者の間ではわからないが、質問するのは明らかすぎるような質問だと思います。

4

3 に答える 3

13

私が話している人は、私にもそう言っている理由を知っているふりをします。

ネイティブリソースを解放するための共通のインターフェース(メソッド)を確立するためです。適切に実装すると、次のIDisposableことができるようになります。

  1. IDisposable必要に応じて、インターフェイス を介してタイプを操作します。
  2. あらゆる場所 usingに書き込むのではなく、ステートメントでタイプの作成をラップします。try/finally
  3. 自動化されたツールを使用してDispose()、クラスのインスタンス(つまり、を実装するクラスのインスタンス)の呼び出しに失敗したインスタンスを検出しますIDisposable
  4. 直接呼び出さないという間違いを犯した場合は、ランタイムに依存してファイナライザーを呼び出します(Dispose()クラスを正しく実装している限り呼び出します)Dispose()。リソース管理が非決定的であるため、これを行う必要があると言っているわけではありませんが、念のための機能としては便利です。

実装する必要はありません。タイプがネイティブリソース(ランタイムで管理できないリソース)を管理している場合実装する必要があります。IDisposable

于 2013-03-25T00:04:51.860 に答える
2

IDisposableインターフェースは、その存在が実際にはその不在よりもクラスについて語っていないという点で独特です。クラスがを実装する場合、クラスは、外部のエンティティ(宇宙のどこにいても、あらゆる種類のエンティティ)に、他の将来のユーザーに損害を与える可能性があるため、追って通知があるまで何かを行うように依頼した可能性IDisposableがあることを示します。それはかもしれませんしたがって、サービスが不要になったときに外部エンティティに通知されるようにする責任があります。たとえば、入力ストリームをカプセル化するオブジェクトが、基盤となるオペレーティングシステムにファイルへの排他的アクセスを要求した可能性があります[おそらく別のコンピューター上にある可能性があります]。オブジェクトがOSにファイルの処理が完了したことを通知するか、オブジェクトをホストしているアプリケーションが終了するまで、ユニバースの他の誰もそのファイルにアクセスできません。したがって、オブジェクトには、ファイルが不要になったときにOSに通知する責任があります。入力ストリームのコンシューマーは、ストリームが実際に外部エンティティに代わって何かをするように要求したかどうかを実際には気にしないことに注意してください。代わりに、ストリームの消費者は、ストリームがもう必要ないことを知るとすぐに、Disposeストリーム上で、それがあれば、それを代行しているすべてのエンティティが(もしあれば)それをやめることができることを通知されるようにするために必要なアクションを実行できます

Note that IDisposable doesn't say that a class will ever actually ask any outside entities to do anything on its behalf, nor that it actually has any cleanup responsibilities, nor that any actual harm would be caused by abandoning an instance without calling Dispose. If a class does not implement IDisposable, however, that provides a very strong indication that instances of the class have not assumed any responsibility to ensure outside resources get cleaned up. At minimum, it provides a strong indication that the object may be safely abandoned without leaving any necessary cleanup actions undone [some types like WeakReference require cleanup but do not implement IDisposable, instead relying upon finalization]

IDisposableしたがって、他のクリーンアップメソッドを使用するのではなく、クラスを実装する正当な理由は、クリーンアップが実際には必要ないという誤った印象を与えないようにするためだと思います。

于 2013-03-25T19:50:42.967 に答える
0

例外、アプリケーションのクラッシュなど、どのような状況でもリリース関数が呼び出されることを確認できれば、IDisposableインターフェイスを実装する必要はありません。

しかし、真実は、クラスまたはコンポーネントを作成している場合、顧客がそれをどのように使用するかを予測することはできません。彼らはあなたのリリース関数を呼び出すのを忘れるかもしれません。これにより、リソースが解放されなくなります。

IDisposableインターフェースの実装は良い習慣です

于 2013-03-25T00:32:02.967 に答える