C#基礎 [11] 解構函式

來源:互聯網
上載者:User

一、解構函式

  解構函式(destructor)用於析構類的執行個體。即在類的執行個體被銷毀之前,執行資源的清理或者釋放非託管資源。下面的程式碼範例中聲明了一個名為Car的類,該類包含一個名為~Car的解構函式:

1     class Car2     {3         ~Car()  // destructor4         {5             // 執行清理6         }7     }

  解構函式的特徵如下:

    1.不能在結構中定義解構函式。只能對類使用解構函式。

    2.每個類只能有一個解構函式。

    3.解構函式名為:"~"+類名,比如~Car。

    4.解構函式不能帶存取修飾詞。

    5.解構函式不能帶參數,自然也無法重載。

    6.解構函式是用來析構類的執行個體的,因此沒有靜態解構函式。

    7.不能顯式調用解構函式。解構函式是在垃圾收集過程中被自動調用的:如果記憶體回收行程認為某個對象符合析構,則調用解構函式(如果有)並回收用來儲存此對象的記憶體。程式退出時也會調用解構函式。

    8.該解構函式隱式地對對象的基類調用 Finalize。反編譯上例的類Car,得到下面的結果:

1 internal class Car2 {3     // Methods4     public Car();5     protected override void Finalize();6 }

  該程式碼封裝括一個建構函式和一個重寫的Finalze方法,其實這就是建構函式編譯之後的代碼。

  下面是另外一個解構函式的樣本:下面的樣本建立三個類,這三個類構成了一個繼承鏈。類 First 是基類,Second 是從 First 派生的,而 Third 是從 Second 派生的。這三個類都有解構函式。在 Main() 中,建立了派生程度最大的類的執行個體。注意:程式運行時,這三個類的解構函式將自動被調用,並且是按照從派生程度最大的到派生程度最小的次序調用。

View Code

 1     class First 2     { 3         ~First() 4         { 5             System.Diagnostics.Trace.WriteLine("First's destructor is called."); 6         } 7     } 8  9     class Second : First10     {11         ~Second()12         {13             System.Diagnostics.Trace.WriteLine("Second's destructor is called.");14         }15     }16 17     class Third : Second18     {19         ~Third()20         {21             System.Diagnostics.Trace.WriteLine("Third's destructor is called.");22         }23     }24 25     class Program26     {27         static void Main(string[] args)28         {29             Third t = new Third();30 31             /* 輸出結果 (在 VS 的輸出視窗中可以看到):32             Third's destructor is called.33             Second's destructor is called.34             First's destructor is called.35             */36         }37     }

二、何時使用解構函式?

  通常,與運行時不進行記憶體回收的開發語言相比,C# 無需太多的記憶體管理。這是因為 .NET Framework 記憶體回收行程會隱式地管理對象的記憶體配置和釋放。但是,當應用程式封裝視窗、檔案和網路連接這類非託管資源時,應當使用解構函式釋放這些資源。當對象符合析構時,記憶體回收行程將運行對象的 Finalize 方法。

三、顯式釋放資源

  如果代碼中包含了需要及時釋放的非託管資源,就不能使用解構函式實現,因為解構函式不能顯式調用,我們不能確定它什麼時候才能被GC調用,所以是不可控制的。對於這種情況,我們可以實現IDisposable介面。只要類實現了IDisposable即可,就可以調用它的Dispose方法來釋放非託管資源。關於IDisposable介面和資源釋放的更多內容,我會在以後的文章中繼續研究。 

  參考:http://msdn.microsoft.com/zh-cn/library/66x5fx1b(VS.100).aspx

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.