无终结器的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
相关产品推荐
相关产品推荐

