gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:11:21 25 4
gpt4 key购买 nike

我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com