C# 編譯器不允許使用者自行重載或呼叫 Finalize 方法——編譯器徹底屏蔽父類別 Finalize 方法(因 C# 單根繼承,System.Object 為所有類別祖先,自然每個類別都有 Finalize),彷彿此方法不存在。以下代碼錯誤:
class MyClass
{
override protected void Finalize() {} // 錯誤
public void MyMethod() { this.Finalize(); } // 錯誤
}
但以下代碼正確:
class MyClass
{
public void Finalize()
{ Console.WriteLine("My Class Destructor"); }
}
public class Test
{
public static void Main()
{
MyClass obj = new MyClass();
obj.Finalize(); // 呼叫的是自訂 Finalize,非 Object.Finalize
}
}
此時 Finalize 已脫離「終結操作」語義,成為一般方法,但也屏蔽了父類別 System.Object.Finalize,需格外小心!
Finalize()。迫切需求可實作 IDisposable 提供公共 Dispose() 方法。Dispose() 後,仍需提供 Finalize(虛擬解構函式),因 Dispose() 不保證被呼叫。.NET 不建議實作終結操作,除非有非受控資料(資料庫連線、檔案開啟等)需嚴格釋放。System.GC.Collect() 強制立即回收。頻繁呼叫顯著降低效能。Dispose()),可呼叫 System.GC.SuppressFinalize() 從佇列移除參考,忽略終結操作。終結操作系統負擔極重。深入了解 .NET 自動垃圾收集後,便能領會 C# 解構函式為何繞大彎實現編程需求,才能遊刃有餘處理記憶體與非記憶體資源回收——這正是解構本原!