使用基类的析构函数/处理?

时间:2011-04-20 14:48:30

标签: c# dispose destructor idisposable finalizer

在C#中,如Documentationthis nice post所接受的答案所述,它声明类不继承其父类的析构函数。

问题: 如果我想确保处理基类的私有元素,是在所有子类中实现IDisposable的正确方法,并在Dispose方法中调用base.Dispose()?

这样做看起来没问题,但我更倾向于一种不需要在所有子类中实现的方法。

4 个答案:

答案 0 :(得分:15)

MSDN表示会自动在基类上调用析构函数。

答案 1 :(得分:6)

您应该点击此处的Disposable pattern。它也适合继承。

这里有趣的部分是“析构函数不继承”,我不知道该怎么做。我写了一点测试,但令我感到宽慰的是,你只需要在基类中编写一个析构函数。

因此,孩子们与基类非托管资源脱钩。他们可以覆盖Dispose(bool)来清理自己的事务。

但我发表了评论,因为我看到太多的程序员只是为了处理托管资源而实现完整模式。

从一般设计的角度来看,一个Disposable类最好是密封的。

答案 2 :(得分:0)

基类应该使用standard IDisposable pattern作为基类 - 这样只有基类需要一个终结器,而派生类只是覆盖虚方法

protected void Dispose(bool disposing)

答案 3 :(得分:0)

如果父类使用Microsoft的IDisposable模式,则子类不应覆盖Dispose(void),而是覆盖Dispose(Boolean Disposing)。如果调用Disposing为true,它应该处理子类并调用base.Dispose(True)。如果使用Disposing false调用,则在大多数情况下,除了调用base.Dispose(False)之外,它应该没有任何内容。

请注意,在大多数情况下,对base.Dispose(False)的调用将不执行任何操作,但无论如何都应该进行调用。如果子类需要添加额外的“非托管资源”(即,如果它具有需要在终结器中执行的额外职责),则通常应将这些职责封装到另一个对象中。请注意,类是否具有终结器的问题不仅仅是“实现细节”;将一个终结器添加到基类可能是一个突破性的变化,导致一个程序泄漏资源(糟糕的,但如果程序一次运行的时间太长,也许可以存活)到一个随机的场合,尝试清理仍在使用的资源(不会经常导致问题,但可能导致罕见但立即失败)。