c# - 编写我们自己的 Dispose 方法而不是使用 Idisposable

标签 c# idisposable

在浏览了很多关于 IDisposable 的文章后,我对它的用法感到困惑。所有文章都解释了它是什么以及如何实现它,但我想了解如果没有它我们将会错过什么。

这是一个实现IDisposable 类的示例。 dispose 的使用通常显示为处理数据库连接。

public class Test : IDisposable
{
    public Test()
    {
        DatabaseConnection databaseConnection = new DatabaseConnection();
    }

    public void Dispose()
    {
        if (this.databaseConnection != null)
        {
            this.databaseConnection.Dispose();
            this.databaseConnection = null;
        }
    }
}

尽管 Dispose() 已实现,但在 Dispose() 方法内部,databaseConnection 的 dispose 属性用于释放连接( this.databaseConnection.Dispose();).

我的问题是为什么我们需要在这种情况下实现IDisposable我们可以直接调用this.databaseConnection.Dispose()和释放连接。为什么在内部还调用对象的 Dispose() 方法时实现 IDisposable

替代IDisposable的方法,我们可以实现一个方法Release()来释放内存。

public class Test
{
    public Test()
    {
        DatabaseConnection databaseConnection = new DatabaseConnection();
    }

    public void Release()
    {
        if (this.databaseConnection != null)
        {
            this.databaseConnection.Dispose();
            this.databaseConnection = null;
        }
    }
}

这两种方法有什么区别?我们真的需要 IDisposable 吗?我期待着具体的解释。

最佳答案

你是对的,使用你的 Release 方法你会得到完全相同的效果,前提是你总是记得调用它。

你应该为这类事情使用 Dispose/IDisposable 的原因是一致性。所有 .NET 开发人员都知道 IDisposable 模式,IDisposable 类表示您应该处理它,并使用 Dispose 方法来处理它。换句话说,使用 IDisposable 模式会立即告诉另一个开发人员,他应该释放该类占用的资源,并且他应该通过调用 Dispose 方法来完成。

实现 IDisposable 的另一个好处是 using block ,它适用于任何 IDisposable 类:

using(var t = new Test())
{
    // use t
}

使用上面的代码将导致 tusing block 的末尾被 Dispose()ed。它是 try...finally block 的语法糖,但它往往使这种代码更简洁,更易于阅读和编写。

关于c# - 编写我们自己的 Dispose 方法而不是使用 Idisposable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3845542/

相关文章:

c# - 代码分析 CA1063 在从 IDisposable 派生并在基类中提供实现时触发

c# - Process.Dispose() 实际上做了什么?

c# - 继承BackgroundService和Dispose()

c# - 匿名事件

c# - C++ DLL 和 C# 代码之间的共享内存

c# - Kinect V2 颜色流字节顺序

ioc-container - Ninject.Mvc 和 Ninject.Wcf 扩展的稳定性

linq - 为什么 FxCop 在没有一次性字段的类上引发错误 "Types that own disposable fields should be disposable"?

c# - asp.net中如何更改日期字符串的格式

c# - 无法在 wpf 中使用 Type.GetMember 访问私有(private)字段