9

問題は、なぜ電話をかける必要があるのかということです。Dispose()いくつかのオブジェクトに?オブジェクトがスコープ外に出たときになぜガベージコレクタがオブジェクトを収集しないのですか?私はそれがそのように実施された理由を理解しようとしています。なるほど、簡単ではないでしょうDispose()ガベージコレクタがスコープ外のオブジェクトを収集したときに呼び出されました。

2 답변


20

ガベージコレクタは非決定的です - それはでオブジェクトを収集しますいくつかのポイントそれらがもはや参照されなくなった後、しかしそれがタイムリーに起こることが保証されていません。これには、循環的な依存関係を許可することや、カウンタをインクリメントおよびデクリメントしないというパフォーマンス上の利点など、参照カウントよりもさまざまな利点があります。

しかし、それはリソースにとってどれがすべきタイムリーな方法(データベース接続、ファイルハンドルなど - メモリ以外のほとんど)でクリーンアップする必要がありますが、それでもリソースを明示的に破棄する必要があります。のusingステートメントは、これをかなり簡単にします。


  • ビットマップを生成しているアプリケーションがあり、dispose()を呼び出さなかったため、アプリケーションがギガバイトのメモリを消費し始めました。私は20秒ごとにビットマップを作成し、そのディスクにすぐに保存され、範囲外になります。しかし、ガベージコレクタはまったく機能していないようです。メモリが上がっているだけなので。 - Karim
  • @カリム:まあ、あなたは確かにそれらのビットマップを処分しているはずです。なぜGCが最終的に収集されなかったのかを診断するには、GCが何が起こっているのかなどを調べる必要があります - しかし、ImageがIDisposableを実装しているのには理由があります... - Jon Skeet

7

Disposeは、管理されていないリソース(データベース接続用ラッパー、古いCOMライブラリなど)をクリーンアップするために使用されます。

編集する詳細については、いくつかのMSDNリンク:

http://msdn.microsoft.com/en-us/library/b1yfkh5e(VS.71).aspx

http://msdn.microsoft.com/en-us/library/0xy59wtx(VS.71).aspx

ガベージコレクタがオブジェクトを回収するときにアンマネージドリソースで何が起こるかを指定するには、保護されたFinalize()メソッドをオーバーライドする必要があります。http://msdn.microsoft.com/en-us/library/system.object.finalize(VS.71).aspx

リンクされた質問


関連する質問

最近の質問