不能對(duì)結(jié)構(gòu)使用析構(gòu)函數(shù)。只能對(duì)類使用析構(gòu)函數(shù)。
一個(gè)類只能有一個(gè)析構(gòu)函數(shù)。
無(wú)法繼承或重載析構(gòu)函數(shù)。
無(wú)法調(diào)用析構(gòu)函數(shù)。它們是被自動(dòng)調(diào)用的。
析構(gòu)函數(shù)既沒(méi)有修飾符,也沒(méi)有參數(shù)。例如,下面是類 MyClass
的析構(gòu)函數(shù)的聲明:
~ MyClass()
{
// Cleanup statements.
}
該析構(gòu)函數(shù)隱式地對(duì)對(duì)象的基類調(diào)用 Object.Finalize 方法。這樣,前面的析構(gòu)函數(shù)代碼被隱式地轉(zhuǎn)換為:
protected override void Finalize()
{
try
{
// Cleanup statements.
}
finally
{
base.Finalize();
}
}
這意味著對(duì)繼承鏈中的所有實(shí)例遞歸地(從派生相近程度最大的到派生相近程度最小的)調(diào)用 Finalize 方法。
程序員無(wú)法控制何時(shí)調(diào)用析構(gòu)函數(shù),因?yàn)檫@由垃圾回收器決定的。垃圾回收器檢查是否存在應(yīng)用程序不再使用的對(duì)象。它認(rèn)為這些對(duì)象符合銷毀條件并回收這些對(duì)象占用的內(nèi)存。程序退出時(shí)也會(huì)調(diào)用析構(gòu)函數(shù)。
可以通過(guò)調(diào)用 GC.Collect 方法強(qiáng)制進(jìn)行垃圾回收,但大多數(shù)情況下應(yīng)避免這樣做,因?yàn)檫@樣會(huì)導(dǎo)致出現(xiàn)性能問(wèn)題。
使用析構(gòu)函數(shù)釋放資源
一般來(lái)說(shuō),您不必像使用 C++ 時(shí)那樣關(guān)注內(nèi)存管理。這是因?yàn)?.NET Framework 垃圾回收器會(huì)隱式地管理對(duì)象的內(nèi)存分配和釋放。但是,當(dāng)應(yīng)用程序封裝窗口、文件和網(wǎng)絡(luò)連接這類非托管資源時(shí),應(yīng)當(dāng)使用析構(gòu)函數(shù)釋放這些資源。當(dāng)對(duì)象符合銷毀條件時(shí),垃圾回收器會(huì)運(yùn)行對(duì)象的 Finalize 方法。
資源的顯式釋放
如果您的應(yīng)用程序在使用昂貴的外部資源,則還建議您提供一種在垃圾回收器釋放對(duì)象前顯式地釋放資源的方式。可通過(guò)實(shí)現(xiàn) Dispose 方法(來(lái)自 IDisposable 接口)來(lái)完成這一點(diǎn),該方法為對(duì)象執(zhí)行必要的清理。這樣可大大提高應(yīng)用程序的性能。即使有這種對(duì)資源的顯式控制,析構(gòu)函數(shù)也是一種保護(hù)措施,可用來(lái)在對(duì) Dispose 方法的調(diào)用失敗時(shí)清理資源。
有關(guān)清理資源的更多詳細(xì)信息,請(qǐng)參見(jiàn)下列主題:
請(qǐng)參見(jiàn)
“垃圾回收”編程要旨 | 8.13 using 語(yǔ)句 | 構(gòu)造函數(shù)和析構(gòu)函數(shù)
--------------------------------------------------
unsafe 關(guān)鍵字表示不安全上下文,該上下文是任何涉及指針的操作所必需的。
可以在類型或成員的聲明中使用 unsafe 修飾符。因此,類型或成員的整個(gè)正文范圍均被視為不安全上下文。例如,以下是用 unsafe 修飾符聲明的方法:
unsafe static void FastCopy ( byte[] src, byte[] dst, int count )
{
// unsafe context: can use pointers here
}
不安全上下文的范圍從參數(shù)列表擴(kuò)展到方法的結(jié)尾,因此指針在以下參數(shù)列表中也可以使用:
unsafe static void FastCopy ( byte* ps, byte* pd, int count ) {...}
還可以使用不安全塊從而能夠使用該塊內(nèi)的不安全代碼。例如:
unsafe
{
// unsafe context: can use pointers here
}
若要編譯不安全代碼,必須指定 /unsafe 編譯器選項(xiàng)。無(wú)法通過(guò)公共語(yǔ)言運(yùn)行庫(kù)驗(yàn)證不安全代碼。
示例
// cs_unsafe_keyword.cs
// compile with: /unsafe
using System;
class UnsafeTest
{
// unsafe method: takes pointer to int:
unsafe static void SquarePtrParam (int* p)
{
*p *= *p;
}
unsafe public static void Main()
{
int i = 5;
// unsafe method: uses address-of operator (&)
SquarePtrParam (&i);
Console.WriteLine (i);
}
}
輸出
25