StreamReader类同时具有close和dispose方法。我想知道要调用哪种方法来清理所有资源。
如果使用了block,我认为它会调用它的dispose方法。是否足以清理所有资源。
答案 0 :(得分:26)
using
块将在Dispose()
实例上调用StreamReader
。一般来说,如果类型为IDisposable
,则应将其放在using
范围内。
修改强>
如果您使用Reflector查看Close()
StreamReader
实现,您会看到它正在调用Dispose(true)
。因此,如果您未使用using
范围,则手动调用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);
}
}
}
答案 1 :(得分:3)
我们都知道System.IO.StreamReader
不是唯一实现IDisposable
和Close()
方法的.NET 4.0+类。对于此问题中StreamReader
的情况,源代码显示基类TextReader.Close()
,TextReader.Dispose()
都运行相同的代码行。您还可以在代码中看到TextReader.Dispose()
是您致电StreamReader.Dispose()
时的实施方式(因为StreamReader
不会覆盖Dispose
的方法重载签名。
因此,对StreamReader.Dispose()
的调用将运行this inherited line of code,后者会调用受保护的覆盖方法StreamReader.Dispose(disposing: true)
,因此StreamReader.Close()
会调用StreamReader.Dispose(disposing: true)
。因此,对于StreamReader
的情况,Close()
和Dispose()
确实会运行相同的代码行。
对于 Close()或Dispose()?的问题,更一般,非特定于类的答案可能是要注意到Microsoft已经相当清楚documentation on implementing IDisposable
and the Dispose pattern。快速阅读足以向您展示实现Close()
方法不是Dispose模式的要求。
imho在实现Close()
的那么多类上找到方法IDisposable
的原因是约定的结果,而不是要求。
有人评论
使用Dispose模式实现IDisposable
的另一个类的示例,并且具有Close()
方法。在这种情况下,Close()
是否运行与Dispose()
相同的代码?我没看过源代码,但我不一定说。
答案 2 :(得分:1)
使用块就是你需要的所有东西。
答案 3 :(得分:1)
通过使用块使用Dispose以保证清理发生。
如果在使用块结束之前大量完成对象,请使用Close,以尽可能快地释放任何资源。
因此,两者将携手合作,但如果你要在几纳秒内到达块的末尾,后者可能是多余的。
答案 4 :(得分:0)
如果您想了解有关using
的更多信息,请点击此处
来自网站的引用:
using语句允许 程序员指定何时对象 使用资源应该发布 他们。提供给使用的对象 声明必须执行 IDisposable接口。这个界面 提供Dispose方法,其中 应释放对象的资源。
答案 5 :(得分:0)
似乎对Dispose
是否真正正常工作感到担忧。
基本上 - 你可以相当肯定实现IDisposable
的BCL(基类库)中的任何东西在调用dispose时都会正确整理自己 - 例如当使用using语句时超出范围。
如果流中没有关闭的问题,他们现在就会被接收 - 你可以相信IDisposable
。当您使用其他依赖Dispose
实现的库时。