当前位置: 首页 > backend >正文

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

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

核心作用

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

使用场景与限制

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

代码示例

public class ResourceHolder 
{private IntPtr fileHandle; // 非托管文件句柄 ~ResourceHolder() // 析构函数 {CloseHandle(fileHandle); // 调用Win32 API释放资源 }
}

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

与const的关键区别:

特性constreadonly
初始化时机编译时运行时(构造函数)
内存存储无独立存储有独立内存位置
作用域隐含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关键字:增强代码可读性,避免歧义(但避免过度使用)。
http://www.xdnf.cn/news/8683.html

相关文章:

  • java 代码查重(五)比较余弦算法、Jaccard相似度、欧式距离、编辑距离等在计算相似度的差异
  • 开发者工具箱-鸿蒙大小写转换开发笔记
  • H3C-WAF-单机部署
  • 【每天一个知识点】“数字人”(Digital Human)
  • Easy Dataset数据集构建使用
  • 解析 Flask 上下文机制:请求上下文、应用上下文
  • AI Agent开发第74课-解构AI伪需求的魔幻现实主义
  • 【c++】成员函数被声明为 `const` 时
  • Oracle 的SHRINK 操作实现原理
  • 软考学习中
  • Docker Swarm配置
  • Linux系统基础——是什么、适用在哪里、如何选
  • 模拟电子技术基础----绪论
  • Python 训练营打卡 Day 34
  • 前端流行框架Vue3教程:24.动态组件
  • vue3使用七牛云上传文件
  • MATLAB例程——基于分批运输与最近邻优化的垃圾运输路径规划,n个垃圾收集点,每点有固定垃圾量,车辆从处理厂出发收集垃圾后返回,目标是最小化总行驶距离
  • 洛谷B2144 阿克曼(Ackermann)函数
  • 互联网和以太网之是什么与区别
  • 2025年安克创新Anker社招校招入职测评 | 3天备考、自适应能力cata测评北森题库、安克创造者启航试炼、安克AI能力测评能力测评历年真题
  • Python协同过滤算法:从原理到实战应用
  • 数据库6——综合实验-水果商店进阶一
  • C++题解(33)2025年顺德区中小学生程序设计展示活动(初中组C++)U560876 美丽数(一)和 U560878 美丽数(二)题解
  • 优启通添加自定义浏览器及EXLOAD使用技巧分享
  • 安全语音通信系统python
  • MSP430通用按键代码(KEY)设计与实现
  • 鸿蒙UI开发——Builder函数的封装
  • 【数据集】中国多属性建筑数据集CMAB
  • 互联网大厂Java求职面试实录 —— 严肃面试官遇到搞笑水货程序员
  • RAM(随机存取存储器)的通俗解释及其在路由器中的作用