欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

全面解讀C#編程中的析構函數用法

 更新時間:2016年01月30日 17:44:26   投稿:goldensun  
這篇文章主要介紹了C#編程中的析構函數用法,文中最后還整理了析構函數與Dispose()方法的區(qū)別,需要的朋友可以參考下

析構函數用于析構類的實例。
備注
不能在結構中定義析構函數。只能對類使用析構函數。
一個類只能有一個析構函數。
無法繼承或重載析構函數。
無法調用析構函數。它們是被自動調用的。
析構函數既沒有修飾符,也沒有參數。
例如,下面是類 Car 的析構函數的聲明:

class Car
{
 ~Car() // destructor
 {
  // cleanup statements...
 }
}

該析構函數隱式地對對象的基類調用 Finalize。這樣,前面的析構函數代碼被隱式地轉換為以下代碼:

protected override void Finalize()
{
 try
 {
  // Cleanup statements...
 }
 finally
 {
  base.Finalize();
 }
}

這意味著對繼承鏈中的所有實例遞歸地調用 Finalize 方法(從派生程度最大的到派生程度最小的)。

注意
不應使用空析構函數。如果類包含析構函數,F(xiàn)inalize 隊列中則會創(chuàng)建一個項。調用析構函數時,將調用垃圾回收器來處理該隊列。如果析構函數為空,只會導致不必要的性能損失。
程序員無法控制何時調用析構函數,因為這是由垃圾回收器決定的。垃圾回收器檢查是否存在應用程序不再使用的對象。如果垃圾回收器認為某個對象符合析構,則調用析構函數(如果有)并回收用來存儲此對象的內存。程序退出時也會調用析構函數。
可以通過調用 Collect 強制進行垃圾回收,但大多數情況下應避免這樣做,因為這樣會導致性能問題。
使用析構函數釋放資源
通常,與運行時不進行垃圾回收的開發(fā)語言相比,C# 無需太多的內存管理。這是因為 .NET Framework 垃圾回收器會隱式地管理對象的內存分配和釋放。但是,當應用程序封裝窗口、文件和網絡連接這類非托管資源時,應當使用析構函數釋放這些資源。當對象符合析構時,垃圾回收器將運行對象的 Finalize 方法。
資源的顯式釋放
如果您的應用程序在使用昂貴的外部資源,我們還建議您提供一種在垃圾回收器釋放對象前顯式地釋放資源的方式??赏ㄟ^實現(xiàn)來自 IDisposable 接口的 Dispose 方法來完成這一點,該方法為對象執(zhí)行必要的清理。這樣可大大提高應用程序的性能。即使有這種對資源的顯式控制,析構函數也是一種保護措施,可用來在對 Dispose 方法的調用失敗時清理資源。

下面的示例創(chuàng)建三個類,這三個類構成了一個繼承鏈。類 First 是基類,Second 是從 First 派生的,而 Third 是從 Second 派生的。這三個類都有析構函數。在 Main() 中,創(chuàng)建了派生程度最大的類的實例。注意:程序運行時,這三個類的析構函數將自動被調用,并且是按照從派生程度最大的到派生程度最小的次序調用。

class First
{
 ~First()
 {
  System.Diagnostics.Trace.WriteLine("First's destructor is called.");
 }
}

class Second : First
{
 ~Second()
 {
  System.Diagnostics.Trace.WriteLine("Second's destructor is called.");
 }
}

class Third : Second
{
 ~Third()
 {
  System.Diagnostics.Trace.WriteLine("Third's destructor is called.");
 }
}

class TestDestructors
{
 static void Main()
 {
  Third t = new Third();
 }

}

輸出:

 Third's destructor is called.
 Second's destructor is called.
 First's destructor is called.


析構函數與Dispose()方法的區(qū)別
1. Dispose需要實現(xiàn)IDisposable接口。

2. Dispose由開發(fā)人員代碼調用,而析構函數由GC自動調用。

3. Dispose方法應釋放所有托管和非托管資源。而析構函數只應釋放非托管資源。因為析構函數由GC來判斷調用,當GC判斷某個對象不再需要的時候,則調用其析構方法,這時候該對象中可能還包含有其他有用的托管資源。

4. 通過系統(tǒng)GC頻繁的調用析構方法來釋放資源會降低系統(tǒng)性能,所以推薦顯示調用Dispose方法。

5. Dispose方法結尾處加上代碼“GC.SuppressFinalize(this);”,即告訴GC不需要再調用該對象的析構方法,否則,GC仍會在判斷該對象不再有用后調用其析構方法,雖然程序不會出錯,但影響系統(tǒng)性能。

6、析構函數 和 Dispose 釋放的資源應該相同,這樣即使類使用者在沒有調用 Dispose 的情況下,資源也會在 Finalize 中得到釋放。

7、Finalize 不應為 public。

8、有 Dispose 方法存在時,應該調用它,因為 Finalize 釋放資源通常是很慢的。

相關文章

最新評論