程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#銳利體驗(五)(4)

C#銳利體驗(五)(4)

編輯:關於C語言

析構器

由於.Net平台的自動垃圾收集機制,C#語言中類的析構器不再如傳統C++那麼必要,析構器不再承擔對象成員的內存釋放--自動垃圾收集機制保證內存的回收。實際上C#中已根本沒有delete操作!析構器只負責回收處理那些非系統的資源,比較典型的如:打開的文件,獲取的窗口句柄,數據庫連接,網絡連接等等需要用戶自己動手釋放的非內存資源。我們看下面例子的輸出:

using System;
class MyClass1
{
    ~MyClass1()
    {
        Console.WriteLine("MyClass1's destructor");
    }
}
class MyClass2: MyClass1
{
    ~MyClass2()
    {
        Console.WriteLine("MyClass2's destructor");
    }
}
public class Test
{
    public static void Main()
    {
        MyClass2 MyObject = new MyClass2();
        MyObject = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();
    }
}

編譯程序並運行可以得到下面的輸出:

MyClass2's destructor
MyClass1's destructor

其中程序中最後兩句是保證類的析構器得到調用。GC.Collect()是強迫通用語言運行時進行啟動垃圾收集線程進行回收工作。而GC.WaitForPendingFinalizers()是掛起目前的線程等待整個終止化(Finalizaion)操作的完成。終止化(Finalizaion)操作保證類的析構器被執行,這在下面會詳細說明。

析構器不會被繼承,也就是說類內必須明確的聲明析構器,該類才存在析構器。用戶實現析構器時,編譯器自動添加調用父類的析構器,這在下面的Finalize方法中會詳細說明。析構器由於垃圾收集機制會被在合適的的時候自動調用,用戶不能自己調用析構器。只有實例析構器,而沒有靜態析構器。

那麼析構器是怎麼被自動調用的?這在 .Net垃圾回收機制由一種稱作終止化(Finalizaion)的操作來支持。.Net系統缺省的終止化操作不做任何操作,如果用戶需要釋放非受管資源,用戶只要在析構器內實現這樣的操作即可--這也是C#推薦的做法。我們看下面這段代碼:

using System;
class MyClass1
{
    ~MyClass1()
    {
        Console.WritleLine("MyClass1 Destructor");
    }
}

而實際上,從生成的中間代碼來看我們可以發現,這些代碼被轉化成了下面的代碼:

using System;
class MyClass1
{
    protected override void Finalize()
    {
        try
        {
Console.WritleLine("My Class1 Destructor");
        }
        finally
        {
            base.Finalize();
        }
    }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved