2011-10-22 7 views
6

私はジェフリー・リヒターによって、この記事で、 「Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework」を読んでいた、と私はReRegisterForFinalizeまたはSuppressFinalizeを使用するための任意の実際の生活のサンプルを考えることができませんでした。ReRegisterForFinalize SuppressFinalize実際の生活の例

誰かに私にいくつかの例を教えてもらえますか?

+0

'SuppressFinalize'は一般的ですが、' ReRegisterForFinalize'を使用したい場合は考えてください。 – CodesInChaos

答えて

9

.NETフレームワークで使用される場所のほんの一握りで、見るのには常に良い場所です。基本パターンは、

  • です。配置されたオブジェクトは再利用されます。 Dispose()メソッドがSuppressFinalizeを呼び出して再登録する必要があります(NativeWindow、RequestContextBase、TaskExceptionHolderクラス)
  • ファイナライザが失敗し、例外がキャッチされました。リトルはやるが、後でやり直す。これを行うことは理にかなっていることを確認するために、(!は!AppDomain.CurrentDomain.IsFinalizingForUnload()& &をEnvironment.HasShutdownStarted)あればコードがでラップされた(DynamicResolverとLoaderAllocatorScoutクラス)
  • オブジェクトは、キャッシング・スキームに参加し、再を取得キャッシュされた(OverlappedDataクラス)
3

IDisposableの実装では、しばしばSuppressFinalizeが必要です。コードはhereまたはhereです。

私はReRegisterForFinalizeの良い例がありません。

+1

OK 'SuppressFinalize'は、これらのサンプルを読み込んだ後、かなりストレートに見えます。私が自分でオブジェクトをディップしてしまうと、コストのかかるファイナライズメソッドが呼び出されることを防ぎます。 – Nahum

1

インスタンスを復活させるには、ReRegisterForFinalizeが必要です。復活(リンクされた記事で言及されている)は、オブジェクトをデストラクタ(ファイナライザ)から再ルートするアクションです。

「これはいつオブジェクトを復活させるでしょうか? this questionへの私の答えでは、コネクションプールまたは同様の構成がそれを使用するかもしれないと推測しました。

+0

'ReRegisterForFinalize'をいつ使ってみたいのかまだ分かりません。 – Nahum

+1

'普通の'アプリケーションやライブラリコードでは、そうしないと思います。 ConnectionPoolは高度に特化したソフトウェアです。 –

関連する問題