一、解構函式
解構函式(destructor)用於析構類的執行個體。即在類的執行個體被銷毀之前,執行資源的清理或者釋放非託管資源。下面的程式碼範例中聲明了一個名為Car的類,該類包含一個名為~Car的解構函式:
1 class Car2 {3 ~Car() // destructor4 {5 // 執行清理6 }7 }
解構函式的特徵如下:
1.不能在結構中定義解構函式。只能對類使用解構函式。
2.每個類只能有一個解構函式。
3.解構函式名為:"~"+類名,比如~Car。
4.解構函式不能帶存取修飾詞。
5.解構函式不能帶參數,自然也無法重載。
6.解構函式是用來析構類的執行個體的,因此沒有靜態解構函式。
7.不能顯式調用解構函式。解構函式是在垃圾收集過程中被自動調用的:如果記憶體回收行程認為某個對象符合析構,則調用解構函式(如果有)並回收用來儲存此對象的記憶體。程式退出時也會調用解構函式。
8.該解構函式隱式地對對象的基類調用 Finalize。反編譯上例的類Car,得到下面的結果:
1 internal class Car2 {3 // Methods4 public Car();5 protected override void Finalize();6 }
該程式碼封裝括一個建構函式和一個重寫的Finalze方法,其實這就是建構函式編譯之後的代碼。
下面是另外一個解構函式的樣本:下面的樣本建立三個類,這三個類構成了一個繼承鏈。類 First 是基類,Second 是從 First 派生的,而 Third 是從 Second 派生的。這三個類都有解構函式。在 Main() 中,建立了派生程度最大的類的執行個體。注意:程式運行時,這三個類的解構函式將自動被調用,並且是按照從派生程度最大的到派生程度最小的次序調用。
View Code
1 class First 2 { 3 ~First() 4 { 5 System.Diagnostics.Trace.WriteLine("First's destructor is called."); 6 } 7 } 8 9 class Second : First10 {11 ~Second()12 {13 System.Diagnostics.Trace.WriteLine("Second's destructor is called.");14 }15 }16 17 class Third : Second18 {19 ~Third()20 {21 System.Diagnostics.Trace.WriteLine("Third's destructor is called.");22 }23 }24 25 class Program26 {27 static void Main(string[] args)28 {29 Third t = new Third();30 31 /* 輸出結果 (在 VS 的輸出視窗中可以看到):32 Third's destructor is called.33 Second's destructor is called.34 First's destructor is called.35 */36 }37 }
二、何時使用解構函式?
通常,與運行時不進行記憶體回收的開發語言相比,C# 無需太多的記憶體管理。這是因為 .NET Framework 記憶體回收行程會隱式地管理對象的記憶體配置和釋放。但是,當應用程式封裝視窗、檔案和網路連接這類非託管資源時,應當使用解構函式釋放這些資源。當對象符合析構時,記憶體回收行程將運行對象的 Finalize 方法。
三、顯式釋放資源
如果代碼中包含了需要及時釋放的非託管資源,就不能使用解構函式實現,因為解構函式不能顯式調用,我們不能確定它什麼時候才能被GC調用,所以是不可控制的。對於這種情況,我們可以實現IDisposable介面。只要類實現了IDisposable即可,就可以調用它的Dispose方法來釋放非託管資源。關於IDisposable介面和資源釋放的更多內容,我會在以後的文章中繼續研究。
參考:http://msdn.microsoft.com/zh-cn/library/66x5fx1b(VS.100).aspx