2012-05-13 3 views
2

最近、Finalizeメソッドのオーバーロードで実行されているコードに関連する問題が発生しました。Cのメソッドガイドラインとベストプラクティスを完成させる

私はメモリ管理/パフォーマンスに関連する問題をほとんど認識していますが、「どのコードをFinalizeメソッドに含めないでください」というガイドラインがあるかどうかは興味がありますか?例えば

  1. はFinalizeメソッド内から例外をスローしないでください。
  2. コードをすばやく実行する必要があります。
  3. イベントを発生しません(?)
  4. 等...私の場合は

動作が何らかの例外を発生させたこと提起されているイベントに見られました。

私の質問は次のとおりです。ファイナライズ方法については、どのようなガイドライン(いくつかのツールを使用して実施する必要があります)が必要ですか?

答えて

7

ファイナライズがONLYファイナライズやファイナライズのオーバーライドが例外をスローし、ランタイムは、デフォルトのポリシーをオーバーライドするアプリケーションによってホストされていない場合はMSDN

からアンマネージリソースの

を退治するためのものですランタイムはプロセスを終了し、アクティブなtry-finallyブロックまたはファイナライザは実行されません。ファイナライザがリソースを解放または破棄できない場合、この動作によりプロセスの整合性が保証されます。

ファイナライズの操作は、次の制限があります。

ファイナライザは、ガベージコレクションの間に実行される正確な時間は不定です。 CloseメソッドまたはDisposeメソッドを呼び出さない限り、特定の時刻にリソースが解放されることは保証されていません。

2つのオブジェクトのファイナライザは、あるオブジェクトが別のオブジェクトを参照していても、特定の順序で実行されるとは限りません。つまり、オブジェクトAにオブジェクトBへの参照があり、両方にファイナライザがある場合、オブジェクトAのファイナライザの起動時にオブジェクトBが既にファイナライズされている可能性があります。

ファイナライザが実行されているスレッドは、あなたが確定呼んでいる理由はありません

2

指定されていません。オーバーライドのためにあなたに公開していますが、ファイナライズを使用する際のベストプラクティスは、それらを使用することではありません。代わりに、IDisoposableから継承します。これはベストプラクティスであるだけでなく、ガベージコレクションを妨げず、便利な '' using句を使用して自動処理します。このクラスを継承することは、これが処分するリソースを持つオブジェクトであることを他の開発者にも伝えており、私は特別な方法です。 ガベージ・ランの間にGCが処理を呼び出すと思うことさえあります。

要するに、ファイナライズでできることは、disposeで行う方がいいです。

+0

句を使用すると、狭い一連のケース(あるオブジェクトの1回の使用)に適合し、すべての使用例に適合しません。しかし、可能な限り、私はそれを使用することをお勧めします。 –

+5

ガベージコレクタ*決して*呼び出すDispose() –

+0

私の間違い@HansPassant私はそれがした印象の下にあった。編集しました。 –

関連する問題