IDisposableからDisposeを実装する必要があるのはなぜですか。アンマネージリソースを解放するメソッドをクラスに実装した場合はどうなりますか?
私が話す人々は、私がそうしなければならないと言っている理由を知っているふりをします。
正直なところ、これは、一部の開発者の間ではわからないが、質問するのは明らかすぎるような質問だと思います。
IDisposableからDisposeを実装する必要があるのはなぜですか。アンマネージリソースを解放するメソッドをクラスに実装した場合はどうなりますか?
私が話す人々は、私がそうしなければならないと言っている理由を知っているふりをします。
正直なところ、これは、一部の開発者の間ではわからないが、質問するのは明らかすぎるような質問だと思います。
私が話している人は、私にもそう言っている理由を知っているふりをします。
ネイティブリソースを解放するための共通のインターフェース(メソッド)を確立するためです。適切に実装すると、次のIDisposable
ことができるようになります。
IDisposable
必要に応じて、インターフェイス を介してタイプを操作します。using
に書き込むのではなく、ステートメントでタイプの作成をラップします。try/finally
Dispose()
、クラスのインスタンス(つまり、を実装するクラスのインスタンス)の呼び出しに失敗したインスタンスを検出しますIDisposable
。Dispose()
クラスを正しく実装している限り呼び出します)Dispose()
。リソース管理が非決定的であるため、これを行う必要があると言っているわけではありませんが、念のための機能としては便利です。実装する必要はありません。タイプがネイティブリソース(ランタイムで管理できないリソース)を管理している場合に実装する必要があります。IDisposable
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
したがって、他のクリーンアップメソッドを使用するのではなく、クラスを実装する正当な理由は、クリーンアップが実際には必要ないという誤った印象を与えないようにするためだと思います。
例外、アプリケーションのクラッシュなど、どのような状況でもリリース関数が呼び出されることを確認できれば、IDisposableインターフェイスを実装する必要はありません。
しかし、真実は、クラスまたはコンポーネントを作成している場合、顧客がそれをどのように使用するかを予測することはできません。彼らはあなたのリリース関数を呼び出すのを忘れるかもしれません。これにより、リソースが解放されなくなります。
IDisposableインターフェースの実装は良い習慣です