1

我正在开发一个特定类层次结构实现 IDisposable 的项目。

一些类还实现了一个 Finalize 方法( ~MyClass() )

一般来说,它看起来像这样:

public class BaseClass : IDisposable
{
}

public class SomeClass : BaseClass
{
    ~SomeClass()
    {
        Dispose();
    }

    Dispose()
    {
        // Do some stuff.
        base.Dispose();
    }
}

public class AnoterClass : SomeClass
{
    ~AnoterClass()
    {
        Dispose();
    }

    Dispose()
    {
        // Do some stuff.
        base.Dispose();
    }
}

我想知道处理对 Dispose 的调用的正确方法是什么,因为似乎这些对象是通过调用 Dispose() 来处理的,然后由于调用了 Finalize 方法而导致崩溃。

最好将标志保留在层次结构中的最低类(受保护的布尔处理),并在类层次结构的每个级别中检查它?

我发现每个可能的解决方案都需要一些代码重复,这不是我想要的。

4

2 回答 2

5

如果您手动处理对象,则需要禁止完成。

要遵循的模式是here

编辑:

我认为你只需要在类层次结构的特定级别上实现,如果你有一些新的东西要在那个层次上处理,否则我相信基类中的处理会做你需要的一切。如果您在任何特定类中的实现只是调用base.Dispose(disposing),那么就不需要它,如果它必须做一些干净的 uop,然后调用,base.Dispose()那么您需要它。

按照您的建议拥有一个受保护的标志应该没问题。

于 2012-10-20T10:21:35.990 回答
4

如果您的基类实现了标准的 IDisposable 模式,那么您需要做的就是将覆盖添加到本身拥有或非托管资源Dispose(bool disposing)的每个派生类:IDisposable

protected override void Dispose(bool disposing)
{
    try
    {
        if (disposing)
        {
            // Release managed resources
        }
        // Release unmanaged resources
    }
    finally
    {
        base.Dispose(disposing);
    }
}

您不应该在任何派生类中实现终结器。

而且,当然,层次结构中没有自己的IDisposable资源的任何类都不需要此覆盖。

于 2012-10-20T12:12:29.390 回答