C#核心概念解析:析构函数、readonly与this关键字

🔍 析构函数:资源清理的最后防线

核心作用

析构函数(~ClassName)在对象销毁前执行,专用于释放非托管资源(如文件句柄、非托管内存)。托管资源(如.NET对象)由GC自动回收,一般无需手动处理。

使用场景与限制

  • 仅处理Win32 API资源或非托管内存时需使用。
  • 执行时机不确定(由GC决定),不可依赖于实时清理。
  • 推荐替代方案:实现IDisposable接口+Dispose模式,结合using语句确保资源及时释放。

代码示例

python 复制代码
public class ResourceHolder 
{
    private IntPtr fileHandle; // 非托管文件句柄 

    ~ResourceHolder() // 析构函数 
    {
        CloseHandle(fileHandle); // 调用Win32 API释放资源 
    }
}

📌 readonly修饰符:安全的"只读"守卫

与const的关键区别:

特性 const readonly
初始化时机 编译时 运行时(构造函数)
内存存储 无独立存储 有独立内存位置
作用域 隐含static 支持实例/静态字段

使用场景:

  • 运行时动态赋值:在不同构造函数中设置不同值(如几何图形的边数)。
  • 避免意外修改 :保护对象内部状态(如配置参数、数学常量)。
    代码示例:
python 复制代码
class ConfigLoader 
{
    readonly string _configPath; // 运行时初始化 
 
    public ConfigLoader(string path) => _configPath = path;
    public ConfigLoader() => _configPath = "default.json";  // 不同构造方法赋值 
}

🔑 this关键字:当前实例的"身份证"

三大核心用途:

消除命名冲突

区分同名的类字段与方法参数(慎用,建议参数名加_前缀避免冲突)。

python 复制代码
public void SetValue(int value) => this.value  = value;

链式调用构造函数

在构造函数中通过this调用其他重载构造方法。

python 复制代码
public class User 
{
    public User(string name) : this(name, 18) {} // 调用下方构造函数 
    public User(string name, int age) { ... }
}

传递自身引用

将当前对象作为参数传递给外部方法。

csharp 复制代码
public void Save() => Database.Save(this);

最佳实践总结

  • 析构函数:非托管资源的"保底"清理,优先用IDisposable。
  • readonly:保护字段不被篡改,灵活应对运行时初始化需求。
  • this关键字:增强代码可读性,避免歧义(但避免过度使用)。
相关推荐
覆东流4 小时前
7.Java数组
java·开发语言·后端
码行山野赴时序归途4 小时前
三道经典数组题:从暴力到最优的算法思维
c语言·开发语言·数据结构·算法·leetcode
threerocks4 小时前
AI 原生软件开发生命周期手册 - 如何借助 AI,逐阶段改造软件开发生命周期
前端·javascript·后端
lzhdim4 小时前
提高 SQL 语句执行速度的方法
java·开发语言·数据库·sql·oracle
JavaPub-rodert4 小时前
王仕宇在 Go Context 如何解决协程泄漏与超时控制
开发语言·后端·golang·iphone·javapub·王仕宇
ly76896 小时前
JavaScript 从入门到进阶:核心语法、异步编程与工程化实践
开发语言·javascript·ecmascript
落魄大学生之流水线上谋生计6 小时前
Java锁全面指南:从基础概念到企业级应用
java·开发语言
for_ever_love__6 小时前
python基础语法学习: 闭包
开发语言·python·学习·闭包
ly76896 小时前
Python 全面入门:从核心语法到工程实践
开发语言·python
艾伦_耶格宇8 小时前
【AI】-4 OpenCode Go 接入 Obsidian 完整指南
运维·开发语言·人工智能·agent·opencode