c# - 为什么 Dispose() 应该是非虚拟的?

标签 c# .net dispose idisposable

我是 C# 的新手,如果这是一个明显的问题,我深表歉意。

MSDN Dispose example ,他们定义的 Dispose 方法是非虚拟的。这是为什么?这对我来说似乎很奇怪 - 我希望拥有自己的非托管资源的 IDisposable 的子类只会覆盖 Dispose 并在他们自己的方法底部调用 base.Dispose()。

谢谢!

最佳答案

典型的用法是 Dispose() 被重载,具有公共(public)的、非虚拟的 Dispose() 方法和虚拟的、 protected Dispose(bool)。 public Dispose()方法调用Dispose(true),子类可以使用这个 protected 虚方法释放自己的资源,并为父类调用base.Dispose(true)。

如果拥有公共(public) Dispose() 方法的类也实现了终结器,则终结器调用 Dispose(false),表明在垃圾收集期间调用了 protected Dispose(bool) 方法。

如果有终结器,则公共(public) Dispose() 方法还负责调用 GC.SuppressFinalize() 以确保终结器不再处于事件状态,并且永远不会被调用。这允许垃圾收集器正常处理该类。具有事件终结器的类通常仅作为最后的手段,在 gen0、gen1 和 gen2 清理之后才被收集。

关于c# - 为什么 Dispose() 应该是非虚拟的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3619490/

相关文章:

wpf - ViewModel 中 IDisposable 内存泄漏,为什么?

java - JDialog拒绝关闭

c# - 防止多次处理对象

c# - 当 SSL 和客户端证书与 HttpWebRequest 对象一起使用时发生内存泄漏

c# - 在 .NET 中使用线程时出现 WebClient 错误

C# 集合数据结构 1 :1 Key/Value Mapping

c# - C# 中的 ">>"运算符有什么作用?

.NET 记录或查看 SOAP WebService 的调用/响应

c# - 如何提供两个数组作为 DataRow 参数?

javascript - WebService C# (Ajax) 中缺少参数