为什么需要IDisposable接口?

17 浏览
0 Comments

为什么需要IDisposable接口?

此问题已经有答案了:

正确使用IDisposable接口

我已经阅读了很多文章,它们都说IDisposable的目的是关闭不受管理的对象,比如数据库连接和第三方报告。但我的问题是,如果我可以在我的方法中处理不受管理的对象,为什么要定义Dispose方法呢?

例如,

class Report : IDisposable
{
    public void GenerateReport()
    {
        Report rpt=new Report() //unmanaged object created
        rpt.Dispose(); // Disposing the unmanaged object
    }
    private void Dispose()
    {
        //not sure why this block is needed
    }
}

我的理解正确吗?

admin 更改状态以发布 2023年5月21日
0
0 Comments

实现IDisposable接口的类可以在using块中使用。这种解决方案的一个重要优点是,在离开块后,Dispose方法将自动调用在该区域中创建的对象。这样,我们只能使用实现IDisposable接口的类。

//example :
using(var dClean= new DisposableClean())
{
    //after leaving this using dClean will be automatically destroyed 
}

你创建的对象需要公开一些方法,不一定是命名为Dispose()。你也可以将其命名为Clean()。Dispose()是惯例名称。

0
0 Comments

你的理解是正确的,在你的例子中不需要实现IDisposable。但如果你在你编写的类的生命周期中保留了一个长期存在的对象,那么你就需要实现它。比如说你有这样一个代码:

public class Report : IDisposable
{
  private Stream _reportStream; // This variable lives a long time.
  public void WriteToStream(byte[] data)
  {
    _reportStream.Write(data, 0, data.Length);
  }
  public void Dispose()
  {
    _reportStream?.Dispose();
  }
}

这是一个相当简单的例子,但它显示了_reportStream对象的生命周期与类的生命周期相同,需要在类被清理和垃圾回收的同时进行清理。你可以创建一个名为CleanupObject()的公共方法来完成同样的事情,但这样做就无法使用using块来自动调用Dispose()方法:

using (var myReport = new Report())
{
  // do a bunch of things with myReport;
} // Here the runtime will call myReport.Dispose() for you.
// myReport isn't accessible from here, as it was declared in the using block

0