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

[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方法来显式地释放资源。


http://www.kler.cn/a/563910.html

相关文章:

  • 结构型模式 - 组合模式 (Composite Pattern)
  • Prompt——绘制泳道图
  • vue3-07模拟vue3的响应式原理Proxy (代理对象)与Reflect (反射对象)
  • 《论企业集成平台的理解与应用》审题技巧 - 系统架构设计师
  • 判断一个链表是否为回文结构(C++)
  • 【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
  • 数仓搭建实操(传统数仓orale):DM数据集市层
  • 《论软件维护方法及其应用》审题技巧 - 系统架构设计师
  • 初识Skywalking
  • MuMu模拟器Pro for Mac 安卓手机平板模拟器
  • 在 WPF 项目中集成 Hangfire
  • 防爆手机科普:与普通手机的区别?在危险作业场景扮演什么角色?
  • DeepSeek开源周第二弹:DeepEP如何用RDMA+FP8让MoE模型飞起来?
  • Vue 项目中配置代理的必要性与实现指南
  • ZT15 小红的区间查询
  • FastAPI系列:Ubuntu部署FastAPI项目实战
  • 【MySQL篇】表的操作
  • Vue.js组件开发:从基础到进阶
  • Burp Suite Professional 2024版本安装激活指南
  • 算法系列之递归反转单链表