2011-10-22 18 views

回答

9

它在.NET框架中使用的少數幾個地方,總是一個好看的地方。基本模式是:

  • 處置的對象被重用。 Dispose()方法調用SuppressFinalize,因此需要重新註冊(NativeWindow,RequestContextBase,TaskExceptionHolder類)
  • 終結器失敗並捕獲異常。很少做,但稍後再試。該代碼是包裹着,如果(!Environment.HasShutdownStarted & &!AppDomain.CurrentDomain.IsFinalizingForUnload()),以確保這樣做是有道理的(DynamicResolver和LoaderAllocatorScout類)
  • 對象的緩存機制參與,並得到再緩存(重疊數據類)
3

執行IDisposable通常需要SuppressFinalize:請看代碼herehere

我現在沒有一個很好的例子ReRegisterForFinalize

+1

確定'SuppressFinalize'在閱讀完這些樣本後看起來非常直截了當。如果我自己刪除對象,則可以防止調用代價昂貴的敲定方法。 – Nahum

1

復活實例時需要ReRegisterForFinalize。復活(在鏈接文章中提到)是從其析構函數(終結器)重新生成對象的操作。

這隻會將問題轉移到「您何時復活對象」。在我對this question的回答中,我推測連接池或類似構造可能會使用它。

+0

我仍然不知道什麼時候應該使用'ReRegisterForFinalize' – Nahum

+1

在'正常'應用程序或庫代碼中,您不會。一個ConnectionPool是一個高度專業化的軟件。 –