2012-12-21 54 views
47

我正在研究垃圾收集器如何在c#中工作。我對使用Destructor,DisposeFinalize方法感到困惑。析構函數之間的區別,處理和終結方法

根據我的研究和理解,在我的類中有一個Destructor方法將告訴垃圾回收器以析構函數方法中提到的方式執行垃圾回收,但不能在類的實例上明確調用該方法。

Dispose方法是爲了讓用戶控制垃圾收集。 Finalize方法釋放該類使用的資源,但不釋放該對象本身。

我不確定我是否正確地理解它。請澄清疑惑。歡迎任何進一步的鏈接或指南。

回答

45

析構函數隱式調用Finalize方法,它們在技術上是相同的。 Dispose可用於實現IDisposable接口的那些對象。

您可能會看到:Destructors C# - MSDN

析構函數隱含的基類 對象的調用敲定。

class Car 
{ 
    ~Car() // destructor 
    { 
     // cleanup statements... 
    } 
} 

析構函數代碼被隱式轉換爲下面的代碼:

protected override void Finalize() 
{ 
    try 
    { 
     // Cleanup statements... 
    } 
    finally 
    { 
     base.Finalize(); 
    } 
} 

你的析構函數的理解是正確的:

MSDN從相同的鏈接

程序員無法控制何時析構函數被調用 ,因爲這是由垃圾回收器決定的。垃圾 收集器檢查 應用程序不再使用的對象。如果它認爲某個對象符合銷燬條件,則它將調用析構函數(如果有)並回收用於存儲對象的內存。程序退出時也會調用析構函數。這是 可能通過調用Collect強制垃圾回收,但大部分時間爲 ,這應該避免,因爲它可能會創建性能 問題。

+0

如何通過調用'Collect()'方法強制垃圾回收可能會產生性能問題? – Destructor

35

在C#而言,析構函數和終結器基本上都是可以互換的概念,並且應該被用於收集一個類型時釋放非託管資源,例如外部手柄。它是罕見,你需要寫一個終結器。

與的問題是,GC是非確定性的,所以Dispose()方法(通過IDisposable)使得有可能支持確定性清理。這與垃圾收集無關,並且允許呼叫者更快地釋放任何資源。它也適用於管理的資源(除了非託管),例如,如果您有一個類型封裝(說)數據庫連接,您可能想要處置類型以釋放連接。

+0

所以我覺得Destructor方法應該只包含必須在其銷燬之前執行的代碼,Finalize方法將主要從超類繼承。 –

+3

@VictorMukherjee再次,他們(析構函數和終結器)是可以互換的。它是'Dispose()',它在* destroy之前被稱爲*,但它不被稱爲析構函數或終結器 –

相關問題