在 C# 中,如文档中所述,以及这个不错的帖子已接受的答案,它指出类不继承其父类的析构函数。
问题:如果我想确保释放基类的私有元素,在所有子类中实现 IDisposable 并在 Dispose 方法中调用 base.Dispose() 的正确方法是什么?
这样做看起来不错,但我更喜欢一种不需要在所有子类中实现的方式。
MSDN声明在基类上自动调用析构函数。
您应该在此处遵循Disposable 模式。它也适合继承。
这里有趣的部分是“析构函数不继承”,我不知道该怎么做。我写了一个小测试,但令我松了一口气的是,你只需要在基类中写一个析构函数。
因此,孩子与基类非托管资源分离。他们可以重写Dispose(bool)
来清理他们自己的事务。
但我发表了评论,因为我看到太多程序员实现完整模式只是为了处理托管资源。
从一般设计的角度来看,Disposable 类最好是密封的。
基类应该对基类使用标准的 IDisposable 模式——这样只有基类需要终结器,而派生类只需覆盖虚拟方法
protected void Dispose(bool disposing)
如果父类使用 Microsoft 的 IDisposable 模式,则子类不应重写 Dispose(void),而是重写 Dispose(Boolean Disposing)。如果使用 Disposing true 调用,它应该处理子类并调用 base.Dispose(True)。如果使用 Disposing false 调用,则在大多数情况下,除了调用 base.Dispose(False) 之外什么都没有。
请注意,在大多数情况下,对 base.Dispose(False) 的调用不会执行任何操作,但无论如何都应该这样做。如果子类需要添加额外的“非托管资源”(即,如果它具有需要在终结器中执行的额外职责),它通常应该将这些职责封装到另一个对象中。请注意,类是否具有终结器的问题不仅仅是“实现细节”;向基类添加终结器可能是一项重大更改,导致程序将资源泄漏(不好,但如果程序一次运行时间不长,则可能可以生存)到一个随机的程序中,尝试清理仍在使用的资源(通常不会导致问题,但可能会导致罕见但立即的故障)。