2010-11-16 20 views
3

見從MSDN代碼示例:(http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=VS.100).aspx終結與處置()

// Design pattern for a base class. 
public class Base: IDisposable 
{ 
    private bool disposed = false; 

    //Implement IDisposable. 
    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     if (!disposed) 
     { 
      if (disposing) 
      { 
       // Free other state (managed objects). 
      } 
      // Free your own state (unmanaged objects). 
      // Set large fields to null. 
      disposed = true; 
     } 
    } 

    // Use C# destructor syntax for finalization code. 
    ~Base() 
    { 
     // Simply call Dispose(false). 
     Dispose (false); 
    } 
} 

在它調用GC.SupressFinalize()的Dispose()實現;但是提供析構函數,最後確定對象。

當調用GC.SuppressFinalize()時爲析構函數提供實現有什麼意義?

只是有點混淆意圖是什麼?

回答

5

有2種情況:

  • 你的代碼調用Dispose(首選),並終結被取消,消除了開銷。
  • 您的代碼'泄漏'對象,GC調用Finalizer。
+0

謝謝你。在系統中沒有「使用」上下文的情況下使用對象時有意義。 – msuhash 2010-11-16 11:56:02

6

如果有人忘記調用Dispose,終結器將(最終)運行來做最後的清理。由於最終化會傷害性能,理想情況下,沒有人會忘記處理。使用構造對此有所幫助。

+0

它沒有最終確定,這傷害了表現。這是昂貴的GC。特別是在gen2/LOH收集方面,這是大多數一次性資源預計應該放置的地方。通過結束清理並不比通過Dispose()清理花費更多。但它後來發生並且不確定。這就是爲什麼Dispose應該手動調用的原因。 – user492238 2011-01-17 09:35:27

+0

@ user492238 - 當GC發生,並且你所有的參考文件都沒有了,有一個終結器會讓你把「哦,我需要在這個列表上運行終結器」,而不是清理。這會傷害perf。你是對的,實際上最終確定不是重點。它有一個尚未運行的終結器,因爲有人忘記處理。 – 2011-01-17 12:39:31