析構方法是在垃圾回收、釋放資源時使用的。
析構函數用於析構類的實例。
備注:
不能在結構中定義析構函數。只能對類使用析構函數。
一個類只能有一個析構函數。
無法繼承或重載析構函數。
無法調用析構函數。它們是被自動調用的。
析構函數既沒有修飾符,也沒有參數。
析構方法的定義語法形式如下。
!!!!!!!!!!!!!!!
注意:析構方法的方法名必須與當前所在類名一樣。
~方法名()
{
語句塊;
}
下面是類 Car 的析構函數的聲明
class Car { public int CarID { get; set; } ~Car() { //在析構函數中,可以執行釋放其他托管資源處理 Console.WriteLine($"當前Car對象被釋放,CarID={CarID}"); } }
該析構函數隱式地對對象的基類調用 Finalize。這樣,前面的析構函數代碼被隱式地轉換為:
protected override void Finalize() { try { // cleanup statements... } finally { base.Finalize(); } }
這意味着對繼承鏈中的所有實例遞歸地調用 Finalize 方法(從派生程度最大的到派生程度最小的)。
注意
不應使用空析構函數。如果類包含析構函數,Finalize 隊列中則會創建一個項。調用析構函數時,將調用垃圾回收器來處理該隊列。如果析構函數為空,則只會導致不必要的性能丟失
程序員無法控制何時調用析構函數,因為這是由垃圾回收器決定的。垃圾回收器檢查是否存在應用程序不再使用的對象。如果垃圾回收器認為某個對象符合析構,則調用析構函數(如果有)並回收用來存儲此對象的內存。程序退出時也會調用析構函數。
可以通過調用 Collect 強制進行垃圾回收,但大多數情況下應避免這樣做,因為這樣會導致性能問題。有關更多信息,請參見強制垃圾回收。
通常,與運行時不進行垃圾回收的編程語言相比,C# 無需太多的內存管理。這是因為 .NET Framework 垃圾回收器會隱式地管理對象的內存分配和釋放。但是,當應用程序封裝窗口、文件和網絡連接這類非托管資源時,應當使用析構函數釋放這些資源。當對象符合析構時,垃圾回收器將運行對象的 Finalize 方法。
如果您的應用程序在使用昂貴的外部資源,則還建議您提供一種在垃圾回收器釋放對象前顯式地釋放資源的方式。可通過實現來自 IDisposable 接口的 Dispose 方法來完成這一點,該方法為對象執行必要的清理。這樣可大大提高應用程序的性能。即使有這種對資源的顯式控制,析構函數也是一種保護措施,可用來在對 Dispose 方法的調用失敗時清理資源。
static void TestOne() { Car car1 = new Car() { CarID = 1 }; //將car1引用設置為空 car1 = null; //手動調用GC垃圾回收 Console.WriteLine("手動觸發垃圾回收>"); GC.Collect(); //釋放內存操作,是異步執行的 Console.WriteLine(car1 == null); }
特別說明:
1.靜態類GC中提供了強制回收的接口
2.回收操作是異步執行的
