析構函數
析構函數可以在類實例不再被引用的時候,執行一些釋放資源的工作。
- 關於析構函數需要注意的有:
- 每個類只能有一個析構函數
- 析構函數不能有參數、不能有返回值、不能重載
- 析構函數只能用作類的實例, 所以沒有靜態析構函數
- 記住: 不能在代碼中顯式調用析構函數。相反, 當垃圾回收器分析代碼並認爲代碼中不存在指向該對象的可能路徑時,系統會在垃圾回收過程中調用析構函數。
使用析構函數時一些重要的原則:
- 如果不需要析構函數,就不要實現它。會嚴重影響性能
- 析構函數應該只釋放對象擁有的外部資源
- 析構函數不應該訪問其他對象,因爲您無法確定那些對象是否被銷燬。
dispose 模式
與C++析構函數不同,當對象超出作用域時,不會立即調用c#析構函數。事實上,沒有辦法知道何時調用析構函數。此外,如前所述,您不能顯式調用析構函數。您所知道的是,在對象從託管堆中移除之前,系統會在某個時候調用它。
如果您的代碼包含需要儘快釋放的非託管資源,則不應該將該任務留給析構函數,因爲不能保證析構函數會很快運行。相反,您應該採用所謂的標準dispose模式。
標準處理模式包括以下特點:
- 使用非託管資源的類應該實現IDisposable接口,該接口由一個名爲Dispose的方法組成。Dispose包含釋放資源的清理代碼。
- 當您的代碼使用完這些資源並希望釋放它們時,您的程序代碼應該調用Dispose方法。請注意,調用Dispose的是您的代碼,而不是系統。
- 您的類還應該實現一個析構函數,其中調用Dispose方法,以防之前沒有調用Dispose。