不能對結構使用析構函數。只能對類使用析構函數。
一個類只能有一個析構函數。
無法繼承或重載析構函數。
無法調用析構函數。它們是被自動調用的。
析構函數既沒有修飾符,也沒有參數。例如,下面是類 MyClass
的析構函數的聲明:
~ MyClass()
{
// Cleanup statements.
}
該析構函數隱式地對對象的基類調用 Object.Finalize 方法。這樣,前面的析構函數代碼被隱式地轉換為:
protected override void Finalize()
{
try
{
// Cleanup statements.
}
finally
{
base.Finalize();
}
}
這意味著對繼承鏈中的所有實例遞歸地(從派生相近程度最大的到派生相近程度最小的)調用 Finalize 方法。
程序員無法控制何時調用析構函數,因為這由垃圾回收器決定的。垃圾回收器檢查是否存在應用程序不再使用的對象。它認為這些對象符合銷毀條件并回收這些對象占用的內存。程序退出時也會調用析構函數。
可以通過調用 GC.Collect 方法強制進行垃圾回收,但大多數情況下應避免這樣做,因為這樣會導致出現性能問題。
使用析構函數釋放資源
一般來說,您不必像使用 C++ 時那樣關注內存管理。這是因為 .NET Framework 垃圾回收器會隱式地管理對象的內存分配和釋放。但是,當應用程序封裝窗口、文件和網絡連接這類非托管資源時,應當使用析構函數釋放這些資源。當對象符合銷毀條件時,垃圾回收器會運行對象的 Finalize 方法。
資源的顯式釋放
如果您的應用程序在使用昂貴的外部資源,則還建議您提供一種在垃圾回收器釋放對象前顯式地釋放資源的方式。可通過實現 Dispose 方法(來自 IDisposable 接口)來完成這一點,該方法為對象執行必要的清理。這樣可大大提高應用程序的性能。即使有這種對資源的顯式控制,析構函數也是一種保護措施,可用來在對 Dispose 方法的調用失敗時清理資源。
有關清理資源的更多詳細信息,請參見下列主題:
請參見
“垃圾回收”編程要旨 | 8.13 using 語句 | 構造函數和析構函數
--------------------------------------------------
unsafe 關鍵字表示不安全上下文,該上下文是任何涉及指針的操作所必需的。
可以在類型或成員的聲明中使用 unsafe 修飾符。因此,類型或成員的整個正文范圍均被視為不安全上下文。例如,以下是用 unsafe 修飾符聲明的方法:
unsafe static void FastCopy ( byte[] src, byte[] dst, int count )
{
// unsafe context: can use pointers here
}
不安全上下文的范圍從參數列表擴展到方法的結尾,因此指針在以下參數列表中也可以使用:
unsafe static void FastCopy ( byte* ps, byte* pd, int count ) {...}
還可以使用不安全塊從而能夠使用該塊內的不安全代碼。例如:
unsafe
{
// unsafe context: can use pointers here
}
若要編譯不安全代碼,必須指定 /unsafe 編譯器選項。無法通過公共語言運行庫驗證不安全代碼。
示例
// 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