关闭或处置

StreamReader类同时具有close和dispose方法。 我想知道调用哪种方法来清理所有资源。

如果使用使用块,我认为它会调用它的dispose方法。 是否足以清理所有资源。

using块将在StreamReader实例上调用Dispose() 。 一般来说,如果类型是IDisposable ,则应将其置于using范围内。

编辑:如果您使用Reflector查看StreamReaderClose()实现,您将看到它正在调用Dispose(true) 。 因此,如果您没有使用using scope,则手动调用Close()与在此特定情况下调用Dispose()相同。

 protected override void Dispose(bool disposing) { try { if ((this.Closable && disposing) && (this.stream != null)) { this.stream.Close(); } } finally { if (this.Closable && (this.stream != null)) { this.stream = null; this.encoding = null; this.decoder = null; this.byteBuffer = null; this.charBuffer = null; this.charPos = 0; this.charLen = 0; base.Dispose(disposing); } } } 

处理已经足够并且是必不可少的,因为它会自动调用Close all并执行Close不会执行的更多操作。

使用块是优雅的方式进行处理所以是的,尽可能使用它。

我们都知道System.IO.StreamReader不是唯一实现IDisposableClose()方法的.NET 4.0+类。 对于此问题中StreamReader的情况,源代码显示基类TextReader.Close()TextReader.Dispose()都运行相同的代码行。 您还可以在代码中看到TextReader.Dispose()是调用StreamReader.Dispose()时的实现(因为StreamReader不会覆盖Dispose方法重载签名)。

因此,对StreamReader.Dispose()的调用将运行此inheritance的代码行 ,该代码调用受保护的覆盖方法StreamReader.Dispose(disposing: true) ,因此StreamReader.Close()调用StreamReader.Dispose(disposing: true) 。 因此,对于StreamReader的情况, Close()Dispose()确实会运行相同的代码行。

Close()或Dispose()问题的更一般,非类特定的答案 ,可能需要注意的是,Microsoft 在实现IDisposable和Dispose模式方面有相当清晰的文档 。 快速阅读足以向您展示实现Close()方法不是Dispose模式的要求。

imho在实现IDisposable许多类上找到方法Close()的原因是约定的结果,而不是要求。

有人评论道

关闭和处理 – 要打电话?

使用Dispose模式实现IDisposable的另一个类的示例,并且具有Close()方法。 在这种情况下, Close()是否运行与Dispose()相同的代码? 我没有看过源代码,但我不一定说。

使用块就是您所需要的。

通过使用块使用Dispose以保证清理发生。

如果在使用块结束之前大量使用对象,请使用Close,以尽可能快地释放任何资源。

因此,两者将携手合作,但如果你要在几纳秒内到达块的末端,后者可能是多余的。

如果您想了解有关using更多信息,请查看此处

运用

从网站引用:

using语句允许程序员指定何时使用资源的对象应该释放它们。 提供给using语句的对象必须实现IDisposable接口。 此接口提供Dispose方法,该方法应释放对象的资源。

对于Dispose是否真正正常工作似乎存在一些担忧。

本质上 – 您可以相当确定实现IDisposable的BCL(基类库)中的任何内容在调用dispose时都会正确整理自己 – 例如当using语句超出范围时。

如果流中没有关闭的问题,他们现在就会被接收 – 你可以信任IDisposable 。 当您使用依赖于Dispose实现的其他库时。