Dispose
「管理されていない」リソース (たとえば、ソケット、ファイル ハンドル、ビットマップ ハンドルなど) を解放するためのものであり、ファイナライザーの外部で呼び出されている場合 (disposing
フラグが意味するもの、BTW) は、それが保持している他の IDisposable オブジェクトを破棄するためのものです。もはや有用。
「管理されていない」リソースは CLR によって管理されず (名前の由来)、GC はそれらをいじったり、単独で解放したりしません。メソッド (および実際にそれを使用するコード) がないDispose
場合、オブジェクトのファイナライザーに依存してクリーンアップされます。最終的にはファイナライザーが実行され (アプリが正常で、オブジェクトにファイナライザーがある場合)、ファイナライザーが機能する場合は、すべてがある程度問題ありません....しかし、そうするには時間がかかります。その間にハンドルが足りなくなります。その他のスレッド/プロセス/それらを必要とするものには残念です。
Dispose
ただし、リソースはすぐに解放され、全体的に動作が改善されます。
(ちなみに、これは EF、SQL Server、またはその他のテクノロジに限定されるものではありません。Disposable パターンは .net フレームワーク全体に見られます。使用されなくなった IDisposable がある場合はいつでもそれを利用することをお勧めします。使用済み。)
ケースバイケースで実装するのではなく、これまでのところ実装されている理由についてIDisposable
は...私は100%確信が持てません。しかし、あなたがフレームワークを書いていると想像してください。すべてが IDisposable でない場合は、何かを削除するたびに確認する必要があることを考慮してください。-- オブジェクトが使い捨てかどうか、およびDispose
そうであればそれ。ただし、代わりに IDisposable を「万が一に備えて」実装すると、物事は単純化されます。つまり、常に破棄するだけです。(オブジェクトにクリーンアップするものが何もない場合、それは単にオーバーライドしませんDispose
。この場合、その親のDispose
呼び出されて、必要なあらゆるクリーンアップを実行しますが、これも何もない可能性があります...) そして、コントローラーがクリーンアップするものを持っているのは十分に一般的なケースであり、それが本当の理由ではなくても、それは非常に理にかなっていますとにかくすること。