🔍 析构函数:资源清理的最后防线
核心作用
析构函数(~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关键字:增强代码可读性,避免歧义(但避免过度使用)。