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

[2/11]C#性能优化-不要使用空析构函数-每个细节都有示例代码

在这里插入图片描述

前言

在C#开发中,性能优化是提升系统响应速度和资源利用率的关键环节。
当然,同样是所有程序的关键环节。
通过遵循下述建议,可以有效地减少不必要的对象创建,从而减轻GC的负担,提高应用程序的整体性能。记住,优化应该是有针对性的,只有在确定了性能瓶颈之后,才应该采取相应的措施。

2.不要使用空析构函数

如果类包含析构函数,由创建对象时会在 Finalize 队列中添加对象的引用,以保证当对象无法可达时,仍然可以调用到 Finalize 方法。垃圾回收器在运行期间,会启动一个低优先级的线程处理该队列。相比之下,没有析构函数的对象就没有这些消耗。如果析构函数为空,这个消耗就毫无意 义,只会导致性能降低!因此,不要使用空的析构函数。

在实际情况中,许多曾在析构函数中包含处理代码,但后来因为种种原因被注释掉或者删除掉了,只留下一个空壳,此时应注意把析构函数本身注释掉或删除掉。

错误示范:含有空析构函数

public class ResourceHolderWrong
{
    // 构造函数
    public ResourceHolderWrong()
    {
        // 初始化资源
    }

    // 空析构函数,不推荐
    ~ResourceHolderWrong()
    {
        // 本来是用来释放资源的,但现在没有实际操作
    }
}

正确示范:移除空析构函数

public class ResourceHolderCorrect
{
    // 构造函数
    public ResourceHolderCorrect()
    {
        // 初始化资源
    }

    // 直接移除了析构函数,因为我们不需要它来进行资源清理
}

// 如果确实需要进行资源清理,应该实现 IDisposable 接口
public class ResourceHolderWithCleanup : IDisposable
{
    // 标记是否已经释放资源
    private bool disposed = false;

    // Dispose 方法
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this); // 告诉垃圾回收器不用再调用终结器
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // 释放托管资源
            }

            // 释放非托管资源

            disposed = true;
        }
    }

    // 如果需要,可以保留终结器以防止用户忘记调用 Dispose 方法
    ~ResourceHolderWithCleanup()
    {
        Dispose(false);
    }
}

在这个正确的示范中,我们通过实现IDisposable接口来手动管理资源的释放,而不是依赖于析构函数。这样做不仅可以避免因为空析构函数带来的性能问题,还可以让用户更加明确何时以及如何释放资源。如果确实需要确保资源能够被释放,即使用户忘记了调用Dispose方法,也可以保留一个非空的析构函数作为备用。但是,最好的实践是始终鼓励使用Dispose方法来显式地释放资源。

相关文章:

  • Windows和AD域提权枚举脚本及工具介绍
  • python-leetcode-乘积最大子数组
  • 【CI/CD】Jenkins + Docker +SpringCloud微服务项目持续集成
  • 项目总结nk
  • Android ObjectBox数据库使用与集成指南
  • Doris系列之基础使用
  • Magma:多模态 AI 智体的基础模型
  • DeepSeek 助力 Vue3 开发:打造丝滑的下拉选择框(Dropdown Select)
  • 数据结构——基于单链表创建通讯录
  • LangChain教程 - RAG - PDF问答
  • HarmonyOS+Django实现图片上传
  • AVFormatContext
  • Node.js v16 版本安装
  • 排序(数据结构篇)
  • YOLOv12 ——基于卷积神经网络的快速推理速度与注意力机制带来的增强性能结合
  • 百度觉醒,李彦宏渴望光荣
  • 浅析 Redis 分片集群 Cluster 原理、手动搭建、动态伸缩集群、故障转移
  • 《Spring Boot + MySQL高性能应用实战:性能优化技巧与最佳实践》
  • CMake小结2(PICO为例)
  • 【目标检测旋转框xml2txt】rolabelimg标注的xml格式label转YOLO格式txt文件
  • 金砖国家召开经贸联络组司局级特别会议,呼吁共同抵制单边主义和贸易保护主义
  • 将人工智能送上太空,我国太空计算卫星星座成功发射
  • 4台肺癌手术,2名“90后”患者,这届年轻人的肺怎么了?
  • 融创中国:境外债务重组计划聆讯定于9月15日召开
  • 反制美国钢铝关税!印度拟对美国部分商品征收关税
  • 金价大跌!足金饰品每克一夜便宜14元,涨势是否已终结?