解構函式(Destructor)是實現銷毀類別實例的方法成員。其特徵如下:
~(如 ~MyClass()).NET CLR 提供自動記憶體管理,大多數情況下資源釋放由 GC 自動完成。但 GC 只負責管理受控堆積(Managed Heap)上的物件,對於非受控資源(如檔案控制代碼、資料庫連線、COM 物件、視窗控制代碼等),GC 無法自動釋放,必須由開發者在解構函式中撰寫釋放邏輯。
| 類型 | 儲存位置 | 生命週期管理 |
|---|---|---|
| 值類型(int、struct 等) | 堆疊 | 離開作用域自動釋放,不需 GC |
| 參考類型的「參考變數」 | 堆疊 | 離開作用域自動釋放參考本身 |
| 參考類型的「物件實例」 | 受控堆積 | 由 GC 追蹤與回收 |
關鍵觀念:GC 僅對「堆積上的物件實例」起作用。堆疊上的變數(無論值類型或參考變數)在離開作用域時即自動釋放。
效能影響:擁有解構函式的物件需要「兩次 GC 週期」才能被回收,開銷遠大於無解構函式的物件。因此:
如果類別未使用非受控資源,絕對不要定義解構函式。
public class ResourceHolder
{
// 假設這裡持有非受控資源(如 IntPtr handle)
~ResourceHolder()
{
// 這裡撰寫釋放非受控資源的程式碼
// 例如:CloseHandle(handle); 釋放檔案控制代碼
}
}
建構函式與解構函式雖形式簡單,但其背後涉及 CLR 記憶體管理核心機制。正確理解與使用它們,能幫助你:
CLR 是 .NET 的執行環境,相當於 Java 的 JVM。核心職責:
CLR 監控常見程式錯誤:陣列越界、存取未配置記憶體、資料過大導致記憶體溢位等,大幅提升平台可靠性。