【问题标题】:Disposing base class before inherited class在继承类之前处理基类
【发布时间】:2016-08-16 08:35:20
【问题描述】:

我有两个班级:

public abstract class UnitOfWorkBase: IDisposable { }
public sealed class UnitOfWorkSql: UnitOfWorkBase { }

派生类的Dispose 方法通常如下所示:

protected override void Dispose (bool disposing)
{
    if (!this.Disposed)
    {
        if (disposing)
        {
            // Managed.
        }

        // Unmanaged.

        this.Disposed = true;
    }

    base.Dispose(disposing);
}

我总是在方法结束时看到对base.Dispose(disposing) 的调用。但是,在最近的情况下,需要在派生类中的对象之前处理基类的对象,如下所示:

protected override void Dispose (bool disposing)
{
    base.Dispose(disposing);

    if (!this.Disposed)
    {
        if (disposing)
        {
            // Managed.
        }

        // Unmanaged.

        this.Disposed = true;
    }
}

我不确定这是否被认为是不好的做法。有什么要注意的吗?

【问题讨论】:

  • 我怀疑你没有看到这个变体,因为有这个要求是不寻常的 - 你能否分享更多关于为什么基类需要Dispose的细节?这往往表明您有一些具有不寻常生命周期或关系的类集。
  • @Damien_The_Unbeliever:我将在后续消息中解释上下文。同时,您是否发现此变体存在任何一般性问题?
  • @Damien_The_Unbeliever:UnitOfWorkBase 类包含一个通用的IDbTransaction 对象,而UnitOfWorkSql 类包含一个具体的DbContext 对象。我选择将事务对象保留在基类中,因为所有可预见的数据库平台都将使用IDbTransaction。此外,我不想将实际事务对象公开为publicprotected。所以UnitOfWorkSql 类总是包装在using 语句中,而private 事务对象需要首先被释放。希望这是有道理的。

标签: c# .net inheritance dispose idisposable


【解决方案1】:

我认为你应该在这里打破通常的模式。而不是:

class BaseClass
{
    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            //dispose my resources
        }
    }
}

这样写:

class BaseClass
{
    private void Dispose(bool disposing)
    {
        if (disposing)
        {
            //dispose my resources
            DisposeManagedOverride();
        }

        CloseUnmanagedOverride();
    }

    protected virtual void DisposeManagedOverride() {}

    protected virtual void CloseUnmanagedOverride() {}
}

这样您将确保资源释放的正确顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    相关资源
    最近更新 更多