1. 定義:
簡單來講,析構(gòu)函數(shù),是用來幫助我們來進(jìn)行廢棄對象的內(nèi)存回收的機(jī)制。
2. 語法:
~類名()
{
}
3. 示例:
class Car
{
~Car() //析構(gòu)函數(shù)
{
}
}
4. 注意點:
- 只能對類使用析構(gòu)函數(shù)。
- 一個類只能有一個析構(gòu)函數(shù)。
- 無法繼承或重載析構(gòu)函數(shù)。
- 無法調(diào)用析構(gòu)函數(shù)。 它們是被自動調(diào)用的。
- 析構(gòu)函數(shù)既沒有修飾符,也沒有參數(shù)。
- 不應(yīng)使用空析構(gòu)函數(shù)。 如果析構(gòu)函數(shù)為空,只會導(dǎo)致不必要的性能損失。
5. 作用:
程序員無法控制何時調(diào)用析構(gòu)函數(shù),因為這是由垃圾回收器決定的。 垃圾回收器檢查是否存在應(yīng)用程序不再使用的對象。 如果垃圾回收器認(rèn)為某個對象符合析構(gòu),則調(diào)用析構(gòu)函數(shù)(如果有)并回收用來存儲此對象的內(nèi)存。 程序退出時也會調(diào)用析構(gòu)函數(shù)。
通常,與運行時不進(jìn)行垃圾回收的開發(fā)語言相比,C# 無需太多的內(nèi)存管理。 這是因為 .NET Framework 垃圾回收器會隱式地管理對象的內(nèi)存分配和釋放。 但是,當(dāng)應(yīng)用程序封裝窗口、文件和網(wǎng)絡(luò)連接這類非托管資源時,應(yīng)當(dāng)使用析構(gòu)函數(shù)釋放這些資源。 當(dāng)對象符合析構(gòu)時,垃圾回收器將運行對象的Finalize方法。
6. 繼承鏈中析構(gòu)函數(shù)的釋放順序
class First
{
~First()
{
Console.WriteLine("First's destructor is called.");
}
}
class Second : First
{
~Second()
{
Console.WriteLine("Second's destructor is called.");
}
}
class Third : Second
{
~Third()
{
Console.WriteLine("Third's destructor is called.");
}
}
class TestDestructors
{
static void Main()
{
Third t = new Third();
}
}
/* Output :
Third's destructor is called.
Second's destructor is called.
First's destructor is called.
*/