Iga*_*nik 27
该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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我们都知道System.IO.StreamReader不是唯一实现IDisposable和Close()方法的.NET 4.0+类。为的情况下,StreamReader在这个问题中,源代码显示的基类TextReader.Close(),TextReader.Dispose() 二者运行的代码相同的行。您还可以在TextReader.Dispose()调用时的实现代码中看到该代码StreamReader.Dispose()(因为StreamReader不会覆盖的方法重载签名Dispose)。
因此,对的调用StreamReader.Dispose()将运行此继承的代码行,该代码行将调用受保护的重写方法StreamReader.Dispose(disposing: true),因此将进行StreamReader.Close()调用StreamReader.Dispose(disposing: true)。因此,对于的情况StreamReader,Close()并Dispose()确实在运行相同的代码行。
对Close()或Dispose()问题的更一般的,非特定于类的答案?可能要注意,Microsoft 在实现IDisposable和Dispose模式方面有相当清晰的文档。快速阅读足以表明您实现Close()方法不是Dispose模式的要求。
恕我直言,Close()在这么多实现的类上找到该方法的原因IDisposable是约定的结果,而不是要求的。
有人评论了
IDisposable用Dispose模式实现并具有Close()方法的另一个类的示例。在这种情况下是否Close()运行相同的代码Dispose()?我没有看过源代码,但不一定要说。