Microsoft.NETフレームワークはvoid Dispose()
メソッドの実装を必要とするIDisposable
インターフェイスを提供します。その目的は、IDisposable
の実装が割り当てていた高価なリソースの手動またはスコープベースの解放を有効にすることです。例には、データベースコレクション、ストリーム、およびハンドルが含まれます。IDisposable.Dispose()の実装は冪等でなければなりませんか?
Dispose()
メソッドの実装は、同じインスタンスに対して複数回呼び出されると、一度だけ '廃棄'されるインスタンスとその後に例外をスローしないように呼び出されます。 Javaでは、同様の動作(ストリームとデータベース接続も例として私の頭に浮かんでいます)を持つオブジェクトのほとんどは、Dispose()
メソッドのアナログであるclose()
オペレーションの冪等です。
しかし、私の個人的な.NETでの経験(特にWindowsフォーム)、これらへの後続の呼び出しがObjectDisposedException
を投げるように(NETフレームワーク自体の一部である)ではないすべての実装は、冪等であることを示しています。これは、使い捨てオブジェクトの実装にどのようにアプローチするべきかについて私を本当に混乱させます。このシナリオに共通の答えがあるのですか、それはオブジェクトの具体的なコンテキストとその使用方法に依存していますか?
マイクロソフトが常に自分の推奨に従っているとは限らないという理由だけで、あなたがすべきことではありません。 – linkerro
@linkerro - あなたのやや謎めいたコメントを広げてください。 – Oded
コントロールを2回ディスポーザルした場合、WinFormsが例外をスローすることを彼が指しているのだろうかと思います。 – DaveShaw