解構函式用於析構類的執行個體。
備忘
不能在結構中定義解構函式。只能對類使用解構函式。
一個類只能有一個解構函式。
無法繼承或重載解構函式。
無法調用解構函式。它們是被自動調用的。
解構函式既沒有修飾符,也沒有參數。
例如,下面是類 Car 的解構函式的聲明:
C# 複製代碼
class Car{~ Car() // destructor{// cleanup statements...}}
該解構函式隱式地對對象的基類調用 Finalize。這樣,前面的解構函式代碼被隱式地轉換為以下代碼:
複製代碼
protected override void Finalize(){try{// Cleanup statements...}finally{base.Finalize();}}
這意味著對繼承鏈中的所有執行個體遞迴地調用 Finalize 方法(從派生程度最大的到派生程度最小的)。
| 說明: |
不應使用空解構函式。如果類包含解構函式,Finalize 隊列中則會建立一個項。調用解構函式時,將調用記憶體回收行程來處理該隊列。如果解構函式為空白,只會導致不必要的效能損失。 |
程式員無法控制何時調用解構函式,因為這是由記憶體回收行程決定的。記憶體回收行程檢查是否存在應用程式不再使用的對象。如果記憶體回收行程認為某個對象符合析構,則調用解構函式(如果有)並回收用來儲存此對象的記憶體。程式退出時也會調用解構函式。
可以通過調用 Collect 強制進行記憶體回收,但大多數情況下應避免這樣做,因為這樣會導致效能問題。
使用解構函式釋放資源
通常,與運行時不進行記憶體回收的開發語言相比,C# 無需太多的記憶體管理。這是因為 .NET Framework 記憶體回收行程會隱式地管理對象的記憶體配置和釋放。但是,當應用程式封裝視窗、檔案和網路連接這類非託管資源時,應當使用解構函式釋放這些資源。當對象符合析構時,記憶體回收行程將運行對象的 Finalize 方法。
資源的顯式釋放
如果您的應用程式在使用昂貴的外部資源,我們還建議您提供一種在記憶體回收行程釋放對象前顯式地釋放資源的方式。可通過實現來自 IDisposable 介面的 Dispose 方法來完成這一點,該方法為對象執行必要的清理。這樣可大大提高應用程式的效能。即使有這種對資源的顯式控制,解構函式也是一種保護措施,可用來在對 Dispose 方法的調用失敗時清理資源。
有關清理資源的更多詳細資料,請參見下列主題:
清理非託管資源
實現 Dispose 方法
using 語句(C# 參考)
樣本
下面的樣本建立三個類,這三個類構成了一個繼承鏈。類 First 是基類,Second 是從 First 派生的,而 Third 是從 Second 派生的。這三個類都有解構函式。在 Main() 中,建立了派生程度最大的類的執行個體。注意:程式運行時,這三個類的解構函式將自動被調用,並且是按照從派生程度最大的到派生程度最小的次序調用。
C# 複製代碼
class First{~First(){System.Console.WriteLine("First's destructor is called");}}class Second: First{~Second(){System.Console.WriteLine("Second's destructor is called");}}class Third: Second{~Third(){System.Console.WriteLine("Third's destructor is called");}}class TestDestructors{static void Main(){Third t = new Third();}}