一,什么是析構函數?
在msdn中的解析:析構函數用於析構類的實例。
class A // 基類First { ~A() // 析構函數 { Console.WriteLine("~A()析構函數"); } }
特性:
1》不能在結構中定義析構函數。 只能對類使用析構函數。
2》一個類只能有一個析構函數。
3》無法繼承或重載析構函數。
4》無法調用析構函數。 它們是被自動調用的。
5》析構函數既沒有修飾符,也沒有參數。
二,使用析構函數的有什么用?
一,程序員無法控制何時調用析構函數,因為這是由垃圾回收器決定的。 垃圾回收器檢查是否存在應用程序不再使用的對象。 如果垃圾回收器認為某個對象符合析構,則調用析構函數(如果有)並回收用來存儲此對象的內存。 程序退出時也會調用析構函數。
二,使用析構函數釋放資源
通常,與運行時不進行垃圾回收的開發語言相比,C# 無需太多的內存管理。 這是因為 .NET Framework 垃圾回收器會隱式地管理對象的內存分配和釋放。 但是,當應用程序封裝窗口、文件和網絡連接這類非托管資源時,應當使用析構函數釋放這些資源。 當對象符合析構時,垃圾回收器將運行對象的 Finalize 方法
三,那析構函數和構造函數有什么區別?先上代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace XigouMethod { class Program { static void Main(string[] args) { C c = new C(); // 創建類的實例 } class A // 基類First { ~A() // 析構函數 { Console.WriteLine("~A()析構函數"); } public A() { // 構造函數 Console.WriteLine("A()構造函數"); } } class B : A // B類從A類派生 { ~B() // 析構函數 { Console.WriteLine("~B()析構函數"); } public B() // 構造函數 { Console.WriteLine("B()構造函數"); } } class C : B // C類從B類派生 { ~C() // 析構函數 { Console.WriteLine("~C()析構函數"); } public C() // 構造函數 { Console.WriteLine("C()構造函數"); } } } }
結果:

四,總結:
1》程序運行時,這三個類的析構函數將自動被調用,調用順序是按照從派生程度最大的(~C())到派生程度最小的(~A())次序調用的,和構造函數的調用順序正好相反。則可以得出,當用戶創建類的對象是調用構造函數,而當該對象已經調用完畢時,使用析構函數
2》析構函數(destructor) 與構造函數相反,當對象脫離其作用域時(例如對象所在的函數已調用完畢),系統自動執行析構函數。
3》析構函數往往用來做“清理善后” 的工作(例如在建立對象時用new開辟了一片內存空間,應在退出前在析構函數中用delete釋放)。
4》析構函數名也應與類名相同,只是在函數名前面加一個波浪符~,例如~A( ),以區別於構造函數。它不能帶任何參數,也沒有返回值(包括void類型)。只能有一個析構函數,不能重載。
4》如果用戶沒有編寫析構函數,編譯系統會自動生成一個缺省的析構函數,它也不進行任何操作。所以許多簡單的類中沒有用顯式的析構函數。
