C# 为什么IDisposable接口?
我读过很多文章,其中提到IDisposable的目的是关闭非托管对象,如DB连接和第三方报告。但我的问题是,如果我可以在方法中处理非托管对象而不定义Dispose方法,为什么要定义Dispose方法 比如,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
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);
}
嗨,杰。您可能会发现您的问题和许多其他问题!回答是。此外,如果这个问题最终被标记为重复问题,也不要感到惊讶-之前已经讨论过了:-嗨,杰。您可能会发现您的问题和许多其他问题!回答是。此外,如果这个问题最终被标记为重复问题,也不要感到惊讶——之前已经讨论过了:-