关闭或处置

时间:2010-11-11 10:47:49

标签: c# .net

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

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

6 个答案:

答案 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不是唯一实现IDisposableClose()方法的.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的原因是约定的结果,而不是要求。

有人评论

  

Close and Dispose - which to call?

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

答案 2 :(得分:1)

使用块就是你需要的所有东西。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

如果您想了解有关using的更多信息,请点击此处

Using

来自网站的引用:

  

using语句允许   程序员指定何时对象   使用资源应该发布   他们。提供给使用的对象   声明必须执行   IDisposable接口。这个界面   提供Dispose方法,其中   应释放对象的资源。

答案 5 :(得分:0)

似乎对Dispose是否真正正常工作感到担忧。

基本上 - 你可以相当肯定实现IDisposable的BCL(基类库)中的任何东西在调用dispose时都会正确整理自己 - 例如当使用using语句时超出范围。

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