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关键字:增强代码可读性,避免歧义(但避免过度使用)。
相关推荐
三小河8 小时前
Agent Skill与Rules的区别——以Cursor为例
前端·javascript·后端
蜡笔小马8 小时前
10.Boost.Geometry R-tree 空间索引详解
开发语言·c++·算法·r-tree
IOsetting8 小时前
金山云主机添加开机路由
运维·服务器·开发语言·网络·php
Hilaku8 小时前
不要在简历上写精通 Vue3?来自面试官的真实劝退
前端·javascript·vue.js
唐梓航-求职中9 小时前
编程-技术-算法-leetcode-288. 单词的唯一缩写
算法·leetcode·c#
三小河9 小时前
前端视角详解 Agent Skill
前端·javascript·后端
林开落L9 小时前
从零开始学习Protobuf(C++实战版)
开发语言·c++·学习·protobuffer·结构化数据序列化机制
牛奔9 小时前
Go 是如何做抢占式调度的?
开发语言·后端·golang
颜酱9 小时前
二叉树遍历思维实战
javascript·后端·算法
鹏多多9 小时前
移动端H5项目,还需要react-fastclick解决300ms点击延迟吗?
前端·javascript·react.js