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

Piy*_*ush 8 c# idisposable

经过很多Idisposable的文章后,我对它的用法感到困惑.所有文章都解释了它是什么以及如何实现.如果我们没有,我想了解我们会想念的内容.它是一个接口,其中包含一个方法Dispose().让我们举一个例子通常使用dispose显示为处理数据库连接.

代码就像

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

    public void Dispose()
    {
        if (this.databaseConnection != null)
        {
            this.databaseConnection.Dispose();
            this.databaseConnection = null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

尽管配置已实现但是在dispose方法中,databaseconnection的dispose属性用于释放连接(this.databaseConnection.Dispose();)

我的问题是为什么在这种情况下我们需要实现IDisposable? 我们可以直接调用this.databaseConnection.Dispose()并释放连接.为什么在内部实现dispose也调用对象的dispose属性.作为Idisposable方法的替代方案,我们可以实现释放方法以释放内存.

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

    public void Release()
    {
        if (this.databaseConnection != null)
        {
            this.databaseConnection.Dispose();
            this.databaseConnection = null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这两种方法有什么不同?我们真的需要Idisposable吗?我期待着一个具体的解释.

dri*_*iis 12

你是对的,使用你的Release方法你会得到完全相同的效果,只要你总是记得调用它.

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

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

using(var t = new Test())
{
    // use t
}
Run Code Online (Sandbox Code Playgroud)

使用上面的代码将导致tDispose()在年底编using块.它是一个try... finally块的语法糖,但它往往使这种代码更简洁,更容易阅读和写.

  • @Piyush - 不允许客户端程序员在语言中使用关键字是一个非常重要的事情,远远超出了一致性. (2认同)