14

C# でのメモリ管理に関する記事をいくつか読んだとき、ファイナライザーのメソッドに戸惑いました。

それらに関連する非常に多くの複雑なルールがあります。たとえば、ファイナライザーがいつ呼び出されるかは誰にもわかりません。ctor のコードがスローされたとしても呼び出されます。CLR は、プログラムがシャットダウンしたときにすべてのファイナライザーが呼び出されることを保証しません。

実生活で使用できるファイナライザーは何ですか?

私が見つけた唯一の例は、GC の開始時にビープ音を鳴らすプログラムでした。

コードでファイナライザーを使用していますか? 良いサンプルがいくつかありますか?

更新:

ファイナライザーは、開発者が IDisposable を介して一部のクラスを常に正しく破棄するようにしたい場合に使用できます。(リンク;スティーブ・タウンゼントに感謝)

4

2 に答える 2

5

Finalizer の使用方法については、例を含めて徹底的に説明しています。関連する回答で@SLaksの厚意によるリンク

必要な場合のより簡潔な要約については、こちらも参照してください(これは「あまり頻繁ではない」)。

ここには、別の良い実世界の例とともに、以前の良い答えがあります。

関連する抜粋で要約すると:

ファイナライザーは、ファイル ハンドル、ソケット、カーネル オブジェクトなどの希少なリソースをオペレーティング システムに解放することを保証するために必要です。

より正確な実際の例については、この MSDN 検索で .Net Framework の影響を受けるクラスを参照してください。

http://social.msdn.microsoft.com/Search/en-US?query=%22.Finalize%22&ac=8

ファイナライザーを使用する必要がある場合に考えられる正当な理由の 1 つは、マネージド ラッパーでサードパーティのネイティブ コード API をラップし、基になるネイティブ コード API ライブラリが使用済みのオペレーティング システム リソースをタイムリーに解放する必要がある場合です。

于 2010-11-03T15:12:51.560 に答える
4

私が知っているベスト プラクティスは単純明快で、それらを使用しないことです。ただし、ファイナライザーを使用したい場合、特に管理されていないオブジェクトを処理し、Dispose パターンを実装できない場合 (レガシーの問題はわかりません) はFinalize、注意してメソッドを実装できます (そして、システムのパフォーマンス、オブジェクトをアンデッドにしたり、その他の奇妙なシナリオを作成したりします。例外はキャッチできないので注意してください:))。

99% のケースでは、use Dispose パターンを記述し、このメソッドを使用して自分でクリーンアップするだけで、すべてがうまくいきます。

于 2010-11-03T15:20:10.823 に答える