关闭或处置

use*_*949 33 .net c#

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

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

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)


T. *_*ter 6

我们都知道System.IO.StreamReader不是唯一实现IDisposableClose()方法的.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)。因此,对于的情况StreamReaderClose()Dispose()确实在运行相同的代码行。

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

恕我直言,Close()在这么多实现的类上找到该方法的原因IDisposable是约定的结果,而不是要求的。

有人评论了

关闭并处置-呼叫哪个?

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