关闭或处置
StreamReader类同时具有close和dispose方法。 我想知道调用哪种方法来清理所有资源。
如果使用使用块,我认为它会调用它的dispose方法。 是否足以清理所有资源。
using
块将在StreamReader
实例上调用Dispose()
。 一般来说,如果类型是IDisposable
,则应将其置于using
范围内。
编辑:如果您使用Reflector查看StreamReader
的Close()
实现,您将看到它正在调用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
不是唯一实现IDisposable
和Close()
方法的.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
实现的其他库时。