6

「<a href="https://web.archive.org/web/20130418095110/http://msdn.microsoft.com/en-us/library/bb985010.aspx" rel=" nofollow">ガベージ コレクション: Microsoft .NET Framework での自動メモリ管理」、Jeffrey Richter によるものですが、 ReRegisterForFinalizeorを使用する実際のサンプルは思いつきませんでしSuppressFinalizeた。

誰かが私にいくつかの例を提供してもらえますか?

4

3 に答える 3

10

.NET フレームワークで使用されるいくつかの場所は、常に参照するのに適した場所です。基本的なパターンは次のとおりです。

  • 破棄されたオブジェクトは再利用されます。Dispose() メソッドは SuppressFinalize を呼び出したので、再登録する必要があります (NativeWindow、RequestContextBase、TaskExceptionHolder クラス)
  • ファイナライザーが失敗し、例外をキャッチしました。やることはほとんどありませんが、後で再試行します。そのコードは if (!Environment.HasShutdownStarted && !AppDomain.CurrentDomain.IsFinalizingForUnload()) でラップされ、これを実行する意味があることを確認します (DynamicResolver および LoaderAllocatorScout クラス)
  • オブジェクトはキャッシュ スキームに参加し、再キャッシュされます (OverlappedData クラス)
于 2011-10-22T19:26:09.177 に答える
4

多くの場合、の実装には次のものIDisposableが必要SuppressFinalizeです。コードについては、ここまたはここを参照してください。

今のところ良い例はありませんReRegisterForFinalize

于 2011-10-22T17:31:42.227 に答える
1

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

それは、「いつオブジェクトを復活させるか」という質問に移るだけです。この質問に対する私の回答では、接続プールまたは同様の構造がそれを使用する可能性があると推測しました。

于 2011-10-22T18:03:50.480 に答える