2

最近、Finalizeメソッドのオーバーロードで実行されているコードに関連する問題が発生しました。

私はメモリ管理/パフォーマンスに関連する問題をほとんど知っていますが、「どのコードをFinalizeメソッドに入れるべきか/すべきでないか」についてのガイドラインがあるかどうかに興味がありますか?

例えば:

  1. Finalizeメソッド内から例外をスローしないでください。
  2. コードはすぐに実行されるはずです。
  3. イベントを発生させないでください(?)
  4. 等...

私の場合の動作は、何らかの例外を引き起こしたイベントが発生したために見られました。

だから私の質問は-ファイナライズメソッドに関してどのガイドラインに従う必要がありますか(おそらくいくつかのツールを使用して強制することさえあります)?

4

2 に答える 2

7

ファイナライズは、管理されていないリソースを取り除くためだけのものです

MSDNから

FinalizeまたはFinalizeのオーバーライドが例外をスローし、ランタイムがデフォルトポリシーをオーバーライドするアプリケーションによってホストされていない場合、ランタイムはプロセスを終了し、アクティブなtry-finallyブロックまたはファイナライザーは実行されません。この動作により、ファイナライザーがリソースを解放または破棄できない場合に、プロセスの整合性が保証されます。

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

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

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

ファイナライザーが実行されるスレッドは指定されていません

于 2012-05-13T13:12:30.683 に答える
2

ファイナライズと呼んでいる理由はないはずです。オーバーライドすることはできますが、finalizeを使用する際のベストプラクティスは、それらを使用しないことです。代わりに、IDisoposableから継承します。これはベストプラクティスであるだけでなく、ガベージコレクションに干渉せず、自動処理するための便利な「using」句があります。このクラスを継承すると、他の開発者にも、これは破棄するリソースがあるオブジェクトであり、私は特別な方法であることがわかります。GCは、ガベージの実行中にdisposeを呼び出すと思います。

つまり、finalizeで実行できることはすべて、disposeで実行する方が適切です。

于 2012-05-13T13:36:40.050 に答える