编写我们自己的Dispose方法而不是使用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;
     }
  }
}

尽管配置实现可在内部配置方法中使用数据库连接的配置属性来释放连接(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;
   }

}
}

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


你是对的,使用你的释放方法,你会得到完全相同的效果,只要你总是记得叫它。

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

实现IDisposable另一个好处是可以在任何IDisposable类上使用的using块:

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

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


  • 如果你的Release()工作正常(它没有,但那是另一回事),那么人们就必须学习它,并且与另一个类学习其他东西,等等。
  • 您的Release()永远不会以编程方式找到。 在适用的情况下,可以通过编程方式调用Dispose()

    if(obj is IDisposable)((IDisposable)obj).Dispose();

  • 虽然不经常完成,但完成后,这很重要。

    如果有人可能想在对象使用期间调用它,那么有时会使用像Release()这样的方法。 一个例子是Stream上的Close() 。 请注意,虽然Stream.Dispose()仍然存在,并调用Close()


    IDisposable值得实施,主要是因为它在C#中是一种习语。 每个人都知道IDisposable是干什么的,以及如何处理实现IDisposable的对象。 当您使用IDisposable.Dispose()以外的其他资源释放资源时,您正在偏离通常理解的习惯用法。

    这意味着维护者不必知道你的特定类别的来龙去脉以防止泄漏资源。 在6个月内,你甚至可能会忘记你用这段代码完成的大部分工作。 所有你需要知道的是它实现了IDisposable,它有一个通常理解的含义。

    请记住,IDisposable主要是一个开发者的信号,“嗨,我是一个拥有非托管资源引用的类,你可能不应该等垃圾收集器来清理我。 请注意,这可能是间接通过组合(实现IDisposable的类,因为它具有实现IDisposable的私有成员)。 当一个像样的C#开发人员看到一个实现IDisposable的类时,他们应该立即想到“这个对象是特殊的,当我完成它时需要清理。” 没有什么能阻止你写一个Release()方法; 它只是意味着你更可能意外地泄漏资源,因为你没有使用惯用模式。

    链接地址: http://www.djcxy.com/p/9233.html

    上一篇: Writing our own Dispose method instead of using Idisposable

    下一篇: How to dispose managed resource in Dispose() method in C#?