You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无终结器的Dispose模式是否有意义?为何保留GC.SuppressFinalize调用?

public class DisposableResourceHolder : IDisposable {

    private SafeHandle resource; // handle to a resource

    public DisposableResourceHolder() {
        this.resource = ... // allocates the resource
    }

    public void Dispose() {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing) {
        if (disposing) {
            if (resource!= null) resource.Dispose();
        }
    }
}
无终结器时调用GC.SuppressFinalize的原因

核心几点解释:

  • 子类扩展兼容:当前类没写终结器,但子类继承后完全可能添加终结逻辑。父类Dispose里的GC.SuppressFinalize(this)能确保子类实例调用Dispose后,其终结器不会执行,避免资源重复释放的问题。
  • 统一模式规范:微软推荐的Dispose模式是通用模板,不管当前类是否需要终结器,统一遵循写法能减少开发者的决策成本,避免后续修改时遗漏关键步骤导致错误。
  • 预防未来变更:现在没加终结器不代表以后不会加。如果后续维护时给这个类加上终结器,而之前没写GC.SuppressFinalize,就会出现调用Dispose后仍执行终结逻辑的问题,提前写上能规避这种隐患。
  • 性能优化预留:即使当前无终结器,调用GC.SuppressFinalize的性能开销可以忽略不计;若未来添加终结器,这个调用能阻止对象进入终结队列,减少GC处理终结对象的额外负担,提升整体性能。

内容的提问来源于stack exchange,提问作者meJustAndrew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 19:45:57