c# - 在 C# 中使用 IDisposable 的模板方法模式

标签 c# .net design-patterns dry idisposable

我看到 common guideline在 C# 中实现一次性模式是要有一个抽象基类,它实现 IDisposable 接口(interface)的 Dispose() 方法并提供 protected 虚拟 Disposable(bool) 方法。然后子类需要覆盖 Disposable(bool) 并且总是做类似的事情:

if (!disposed && disposing)
{
    // dispose resources here

    disposed = true;
}

我的问题是:不可能重用这个模式吗?我不喜欢在每个子类中都必须管理这种“处置状态”。我们可以有一些像这样的抽象基类:

public abstract class AbstractResource : IDisposable
{
    private bool myDisposed = false;

    protected abstract void ReleaseUnmanagedResources();

    protected virtual void ReleaseManagedResources()
    {
        // optionally override this to explicitly call Dispose() of other IDisposable objects
    }

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

    private void Dispose(bool disposing)
    {
        if (!myDisposed)
        {
            if (disposing)
            {
                ReleaseManagedResources();
            }

            ReleaseUnmanagedResources();

            myDisposed = true;
        }
    }

    ~AbstractResource()
    {
        Dispose(false);
    }
}

然后此类的用户只需要实现ReleaseUnmanagedResources 和(可选)ReleaseManagedResources。无需处理 bool 值。

我发现 this article提出了类似的技术。但就是这样!没有其他人提到它。这种方法有缺陷吗?

最佳答案

这种方法最大的缺陷是它占用了有限的资源……从一个类派生的能力意味着如果我使用你的实现,我基本上可以和 OOP 说再见了,因为我需要从中派生出很多类你的类,并且不能像我实现接口(interface)时那样从另一个类派生它们。

所以在现实世界中,您会混合使用您的基类的一些类,一些类出于业务目的滚动他们自己的基类,这些基类已经包含 IDisposable 和一些只是实现接口(interface)。我不能代表所有人,但我宁愿使用一种工具(例如 R#)将相同结构应用到所有类,而不是混合使用各种东西。

如果我们有能力从多个基类派生,这可能是一回事,但我们在 C# 中没有。

关于c# - 在 C# 中使用 IDisposable 的模板方法模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46976647/

相关文章:

javascript - 从 JavaScript POST 重新加载 Razor 页面

c# - 包含多个项目的解决方案的 ClickOnce 部署

c++ - 为什么我不能执行动态转换? C 中的策略模式

c# - 公开 ReadOnlyCollection 的 ReadOnlyCollection 同时仍然能够在类中修改它的最佳方法

c# - 从系统中获取注销事件

c# - 按不同的对象排序并转换不同的对象

c# - 有没有办法监视控制台应用程序的状态?

c# - 如何获取引用程序集中的所有类型?

java - 重构基于 boolean 的流程

c - 卡住了编写打印到屏幕的递归函数