私は以下のように.NetのDisposeとFinalizeメソッドについて考えています。私が間違っていれば私を修正してください。Disposeメソッドを呼び出すと、.NETのメモリがクリアされ、圧縮されますか?
Dispose:IDisposableのinferfaceを実装し、Disposeメソッドで未使用/アンマネージコードを削除します。開発者は、すぐに削除する必要がある場合は手動で呼び出す必要があります。または、GCが呼び出されたときにリソースを処分します。
ファイナライズ:GCが呼び出されると、未使用のマネージコードが解放され、IDisposableが実装されている場合はDisposeメソッドが呼び出され、アンマネージリソース(通常)が解放されます。
問題は:Disposeメソッドを使用してリソースを処分すると、メモリはすぐに解放され、(GCのように)圧縮されますか?
オブジェクトがファイナライザを実行する必要があるとシステムが判断した場合、オブジェクトを保持している他のすべてのオブジェクトは一時的に復活し、ファイナライザが実行されるまでガベージコレクションできません。ファイナライザがオブジェクト上で実行されるとき、参照を保持する他のオブジェクトは、(1)既にファイナライザを実行しているか、 (2)ファイナライザの実行をスケジュールする。または(3)他の何人かが使用している。これらのケースのどれにも、他のオブジェクトに対してDisposeを実行する必要はありませんが、それは他のオブジェクトが「GCされている」ことを意味しません。 – supercat
@supercatだから、私は "すでにガベージコレクションされている"とは言わなかった - 私は、扶養家族がガベージコレクタの "パイプライン"のどこかにあり、これらのオブジェクトに 'Dispose'を呼び出すことは悪い考えです(私は難しいことを学ぶのは残念です)。 – dasblinkenlight
ガベージコレクションされたオブジェクトがもう存在しないため、ガベージコレクションとは別のファイナライズを検討します。 GCからオブジェクトへの唯一の既存の参照を隠す場合(たとえば、安全でないコードを使用してintに変換した後、オブジェクト参照に戻す)、再構成されたオブジェクト参照にアクセスしようとすると同等ですconstrastによって、ファイナライズされているオブジェクトによって保持されているオブジェクト参照は、.net GCに関する限り、依然として存在するオブジェクトを参照します。 – supercat