🔍 析構函數:資源清理的最后防線
核心作用
析構函數(~ClassName)在對象銷毀前執行,專用于釋放非托管資源(如文件句柄、非托管內存)。托管資源(如.NET對象)由GC自動回收,一般無需手動處理。
使用場景與限制
- 僅處理Win32 API資源或非托管內存時需使用。
- 執行時機不確定(由GC決定),不可依賴于實時清理。
- 推薦替代方案:實現IDisposable接口+Dispose模式,結合using語句確保資源及時釋放。
代碼示例
public class ResourceHolder
{private IntPtr fileHandle; // 非托管文件句柄 ~ResourceHolder() // 析構函數 {CloseHandle(fileHandle); // 調用Win32 API釋放資源 }
}
📌 readonly修飾符:安全的“只讀”守衛
與const的關鍵區別:
特性 | const | readonly |
---|---|---|
初始化時機 | 編譯時 | 運行時(構造函數) |
內存存儲 | 無獨立存儲 | 有獨立內存位置 |
作用域 | 隱含static | 支持實例/靜態字段 |
使用場景:
- 運行時動態賦值:在不同構造函數中設置不同值(如幾何圖形的邊數)。
- 避免意外修改:保護對象內部狀態(如配置參數、數學常量)。
代碼示例:
class ConfigLoader
{readonly string _configPath; // 運行時初始化 public ConfigLoader(string path) => _configPath = path;public ConfigLoader() => _configPath = "default.json"; // 不同構造方法賦值
}
🔑 this關鍵字:當前實例的“身份證”
三大核心用途:
消除命名沖突
區分同名的類字段與方法參數(慎用,建議參數名加_前綴避免沖突)。
public void SetValue(int value) => this.value = value;
鏈式調用構造函數
在構造函數中通過this調用其他重載構造方法。
public class User
{public User(string name) : this(name, 18) {} // 調用下方構造函數 public User(string name, int age) { ... }
}
傳遞自身引用
將當前對象作為參數傳遞給外部方法。
public void Save() => Database.Save(this);
最佳實踐總結
- 析構函數:非托管資源的“保底”清理,優先用IDisposable。
- readonly:保護字段不被篡改,靈活應對運行時初始化需求。
- this關鍵字:增強代碼可讀性,避免歧義(但避免過度使用)。