我正在研究垃圾收集器如何在c#中工作。我對使用Destructor
,Dispose
和Finalize
方法感到困惑。析構函數之間的區別,處理和終結方法
根據我的研究和理解,在我的類中有一個Destructor方法將告訴垃圾回收器以析構函數方法中提到的方式執行垃圾回收,但不能在類的實例上明確調用該方法。
Dispose
方法是爲了讓用戶控制垃圾收集。 Finalize
方法釋放該類使用的資源,但不釋放該對象本身。
我不確定我是否正確地理解它。請澄清疑惑。歡迎任何進一步的鏈接或指南。
我正在研究垃圾收集器如何在c#中工作。我對使用Destructor
,Dispose
和Finalize
方法感到困惑。析構函數之間的區別,處理和終結方法
根據我的研究和理解,在我的類中有一個Destructor方法將告訴垃圾回收器以析構函數方法中提到的方式執行垃圾回收,但不能在類的實例上明確調用該方法。
Dispose
方法是爲了讓用戶控制垃圾收集。 Finalize
方法釋放該類使用的資源,但不釋放該對象本身。
我不確定我是否正確地理解它。請澄清疑惑。歡迎任何進一步的鏈接或指南。
析構函數隱式調用Finalize方法,它們在技術上是相同的。 Dispose可用於實現IDisposable接口的那些對象。
您可能會看到:Destructors C# - MSDN
析構函數隱含的基類 對象的調用敲定。
class Car { ~Car() // destructor { // cleanup statements... } }
析構函數代碼被隱式轉換爲下面的代碼:
protected override void Finalize() { try { // Cleanup statements... } finally { base.Finalize(); } }
你的析構函數的理解是正確的:
從MSDN從相同的鏈接
例
程序員無法控制何時析構函數被調用 ,因爲這是由垃圾回收器決定的。垃圾 收集器檢查 應用程序不再使用的對象。如果它認爲某個對象符合銷燬條件,則它將調用析構函數(如果有)並回收用於存儲對象的內存。程序退出時也會調用析構函數。這是 可能通過調用Collect強制垃圾回收,但大部分時間爲 ,這應該避免,因爲它可能會創建性能 問題。
在C#而言,析構函數和終結器基本上都是可以互換的概念,並且應該被用於收集一個類型時釋放非託管資源,例如外部手柄。它是很罕見,你需要寫一個終結器。
與的問題是,GC是非確定性的,所以Dispose()
方法(通過IDisposable
)使得有可能支持確定性清理。這與垃圾收集無關,並且允許呼叫者更快地釋放任何資源。它也適用於管理的資源(除了非託管),例如,如果您有一個類型封裝(說)數據庫連接,您可能想要處置類型以釋放連接。
所以我覺得Destructor方法應該只包含必須在其銷燬之前執行的代碼,Finalize方法將主要從超類繼承。 –
@VictorMukherjee再次,他們(析構函數和終結器)是可以互換的。它是'Dispose()',它在* destroy之前被稱爲*,但它不被稱爲析構函數或終結器 –
如何通過調用'Collect()'方法強制垃圾回收可能會產生性能問題? – Destructor