.net - 如何在继承自另一个一次性类的类中实现一次性模式?

标签 .net design-patterns idisposable

我经常在引用少量资源的简单类中使用一次性模式,但我从来没有在从另一个一次性类继承的类上实现这种模式,我开始对如何释放整个资源感到有些困惑。

我从一些示例代码开始:

public class Tracer : IDisposable
{
    bool disposed;
    FileStream fileStream;

    public Tracer()
    {
        //Some fileStream initialization
    }

    public void Dispose()
    {
        this.Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                if (fileStream != null)
                {
                    fileStream.Dispose();
                } 
            }

            disposed = true; 
        }
    }
}

public class ServiceWrapper : Tracer
{
    bool disposed;
    ServiceHost serviceHost;

    //Some properties

    public ServiceWrapper ()
    {
        //Some serviceHost initialization
    }

    //protected override void Dispose(bool disposing)
    //{
    //    if (!disposed)
    //    {
    //        if (disposing)
    //        {
    //            if (serviceHost != null)
    //            {
    //                serviceHost.Close();
    //            } 
    //        }

    //        disposed = true;
    //    }
    //}
}

我真正的问题是:如何在我的 ServiceWrapper 类中实现一次性模式,以确保当我处理它的实例时,它会同时处理继承类和基类中的资源?

谢谢。

最佳答案

我已经看到这是通过几种方式完成的:

  • 在派生类覆盖 Dispose(bool disposing) 中,清理你的东西,然后调用基类 Dispose(bool disposing)。这里的问题是基类已经有处理的门变量和需要复制的检查。
  • 创建一个 protected 清理方法,该方法在基类中调用 Dispose(bool disposing) 以实际执行清理。派生类可以覆盖它,进行清理,并调用基类的清理方法。这将在基类中留下所有不需要复制的已处理检查。
  • 关于.net - 如何在继承自另一个一次性类的类中实现一次性模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2571594/

    相关文章:

    c# - 从用户控件获取图像 - Silverlight

    c# - 什么是 Server.HtmlEncode()?

    javascript - 使用队列处理异步回调

    c++ - 将 "this"动态转换为返回值是否可以?

    c# - 处理先前的可观察 selectmany rx

    .net - 确定服务器上正在使用哪个WCF端点

    c# - 有没有更有效的方法来计算减法表达式的绝对值

    c# - 静态属性可以在 C# 中返回对象/类的新实例吗

    c# - 关闭 using block 中的连接

    entity-framework - 使用和不使用带有 DbContext [代码优先] 的 using 语句有什么区别?