经过很多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)
使用上面的代码将导致t被Dispose()在年底编using块.它是一个try... finally块的语法糖,但它往往使这种代码更简洁,更容易阅读和写.