首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 銳利體驗 (五) (4):解構函式實作機制與 Finalize 轉換

     編輯:關於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 obj = new MyClass2();
        obj = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();
    }
}

輸出:

MyClass2's destructor
MyClass1's destructor

最後兩行確保解構函式被呼叫。GC.Collect() 強制啟動垃圾收集執行緒;GC.WaitForPendingFinalizers() 掛起目前執行緒等待終結操作完成。終結操作保證類別解構函式被執行。

解構函式特性

  • 不會被繼承:類別必須明確宣告解構函式才存在。
  • 使用者實作解構函式時,編譯器自動加入呼叫父類別解構函式。
  • 因垃圾收集機制會在適當時機自動呼叫,使用者不能自行呼叫。
  • 僅有實例解構函式,無靜態解構函式。

解構函式自動呼叫機制:終結操作

.NET 垃圾回收機制透過「終結操作」支援。系統預設終結操作不執行任何動作。使用者需釋放非受控資源時,在解構函式實作即可——這是 C# 建議做法。

編譯器將解構函式轉換為 Finalize 模式

// 原始碼
class MyClass1 { ~MyClass1() { Console.WriteLine("MyClass1 Destructor"); } }

// 實際產生的中介代碼等效形式
class MyClass1
{
    protected override void Finalize()
    {
        try
        {
            Console.WriteLine("MyClass1 Destructor");
        }
        finally
        {
            base.Finalize();
        }
    }
}

解構函式語法糖實際編譯為 try/finally 區塊中的 Finalize 覆寫,確保父類別 Finalize 必被呼叫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved