32

C# は、ガベージ コレクターを使用してリソースを適切に管理できることを知っています。しかし、それがあるので、これは正確には何のためにあり、なぜ必要なのですか?

.Dispose()asp.net mvcでなぜ必要なのか誰でも説明できますか?

また、接続を破棄するとはどういう意味ですか? なぜそれが必要なのですか?のようにデータベース接続を破棄することが重要な理由の複雑さを知っている人はいますdb.Dispose()か? これは EF 関連ですか、それとも SQL Server 関連ですか? その理由を正確に理解しようとしています。

protected override void Dispose(bool disposing)
{
   db.Dispose();
   base.Dispose(disposing);
}
4

1 に答える 1

31

Dispose「管理されていない」リソース (たとえば、ソケット、ファイル ハンドル、ビットマップ ハンドルなど) を解放するためのものであり、ファイナライザーの外部で呼び出されている場合 (disposingフラグが意味するもの、BTW) は、それが保持している他の IDisposable オブジェクトを破棄するためのものです。もはや有用。

「管理されていない」リソースは CLR によって管理されず (名前の由来)、GC はそれらをいじったり、単独で解放したりしません。メソッド (および実際にそれを使用するコード) がないDispose場合、オブジェクトのファイナライザーに依存してクリーンアップされます。最終的にはファイナライザーが実行され (アプリが正常で、オブジェクトファイナライザーがある場合)、ファイナライザーが機能する場合は、すべてがある程度問題ありません....しかし、そうするには時間がかかります。その間にハンドルが足りなくなります。その他のスレッド/プロセス/それらを必要とするものには残念です。

Disposeただし、リソースはすぐに解放され、全体的に動作が改善されます。

(ちなみに、これは EF、SQL Server、またはその他のテクノロジに限定されるものではありません。Disposable パターンは .net フレームワーク全体に見られます。使用されなくなった IDisposable がある場合はいつでもそれを利用することをお勧めします。使用済み。)

ケースバイケースで実装するのではなく、これまでのところ実装されている理由についてIDisposableは...私は100%確信が持てません。しかし、あなたがフレームワークを書いていると想像してください。すべてが IDisposable でない場合は、何かを削除するたびに確認する必要があることを考慮してください。-- オブジェクトが使い捨てかどうか、およびDisposeそうであればそれ。ただし、代わりに IDisposable を「万が一に備えて」実装すると、物事は単純化されます。つまり、常に破棄するだけです。(オブジェクトにクリーンアップするものが何もない場合、それは単にオーバーライドしませんDispose。この場合、その親のDispose呼び出されて、必要なあらゆるクリーンアップを実行しますが、これも何もない可能性があります...) そして、コントローラーがクリーンアップするものを持っているのは十分に一般的なケースであり、それが本当の理由ではなくても、それは非常に理にかなっていますとにかくすること。

于 2012-04-13T02:17:46.613 に答える