C# 为什么IDisposable接口?

C# 为什么IDisposable接口?,c#,.net,C#,.net,我读过很多文章,其中提到IDisposable的目的是关闭非托管对象,如DB连接和第三方报告。但我的问题是,如果我可以在方法中处理非托管对象而不定义Dispose方法,为什么要定义Dispose方法 比如, class Report : IDisposable { public void GenerateReport() { Report rpt=new Report() //unmanaged object created rpt.Dispose

我读过很多文章,其中提到IDisposable的目的是关闭非托管对象,如DB连接和第三方报告。但我的问题是,如果我可以在方法中处理非托管对象而不定义Dispose方法,为什么要定义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
    }
}

我的理解正确吗?

您的示例中不需要实现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

您的示例中不需要实现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

是的,您可以定义自己释放资源的方式,但许多现有代码都使用这种方式。如果您将代码共享给他人,请记住告诉他们以您的方式进行处理

实现IDisposable的一个好处是,您可以通过使用语言构造(如使用)间接调用Dispose

例如:

usingStream s=File.OpenReadHelloWorld.bin { //做事 }
是的,您可以定义自己释放资源的方式,但许多现有代码都使用这种方式。如果您将代码共享给他人,请记住告诉他们以您的方式进行处理

实现IDisposable的一个好处是,您可以通过使用语言构造(如使用)间接调用Dispose

例如:

usingStream s=File.OpenReadHelloWorld.bin { //做事 }
实现IDisposable接口的类可以在using块中使用。此解决方案的一大优点是,在离开块后,将在该区域中创建的对象上自动调用Dispose方法。这样,我们只能使用实现IDisposable接口的类

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

您创建的对象需要公开一些方法,而不需要命名为Dispose。你也可以说它干净。Dispose是常规名称。

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

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

您创建的对象需要公开一些方法,而不需要命名为Dispose。你也可以说它干净。Dispose是一个传统的名称。

垃圾收集器C在整个.Net框架中都可以使用,工作得很好,很容易被忘记。然而,与他合作并利用他的可能性是值得学习的。为此,正确地实现IDISPOSIGNE接口是必要的,如果我们考虑托管和非托管资源的适当发布,其基本形式有时是不够的。 这是扩展版本,在这种情况下非常有用。 从某种程度上说,这是对你问题的回答:

public class DisposableExtended: IDisposable
{
   private bool isDisposed = false;

public void Dispose ()
{
   this.Dispose (true);
   GC.SupressFinalize (this);
}
protected void Dispose (bool disposing)
{
     if (! this.isDisposed)
     {
            if (disposing)
            {
             // here we release managed resources (standard classes)
            }
           // here we release unmanaged resources (e.g. streams, etc..)

     {
}

}
  this .isDisposed = true;
}

~ DisposableExtended ()
{
  this.Dispose (false);
}

垃圾收集器C可以在整个.Net框架中使用,工作得很好,很容易被遗忘。然而,与他合作并利用他的可能性是值得学习的。为此,正确地实现IDISPOSIGNE接口是必要的,如果我们考虑托管和非托管资源的适当发布,其基本形式有时是不够的。 这是扩展版本,在这种情况下非常有用。 从某种程度上说,这是对你问题的回答:

public class DisposableExtended: IDisposable
{
   private bool isDisposed = false;

public void Dispose ()
{
   this.Dispose (true);
   GC.SupressFinalize (this);
}
protected void Dispose (bool disposing)
{
     if (! this.isDisposed)
     {
            if (disposing)
            {
             // here we release managed resources (standard classes)
            }
           // here we release unmanaged resources (e.g. streams, etc..)

     {
}

}
  this .isDisposed = true;
}

~ DisposableExtended ()
{
  this.Dispose (false);
}

嗨,杰。您可能会发现您的问题和许多其他问题!回答是。此外,如果这个问题最终被标记为重复问题,也不要感到惊讶-之前已经讨论过了:-嗨,杰。您可能会发现您的问题和许多其他问题!回答是。此外,如果这个问题最终被标记为重复问题,也不要感到惊讶——之前已经讨论过了:-