什么时候需要file.close()?

时间:2013-02-27 19:07:26

标签: c# file-io

我想知道是否有必要在以下情况下拨打Close()(如果没有必要,为什么?)

using (var file = System.IO.File.OpenText(myFilePath))
{
...
}

我认为在以下情况下有必要

StreamWriter file2 = new System.IO.StreamWriter(myFilePath);
newFileContents.ForEach(file2.WriteLine);
file2.Close();

这是对的吗?

修改

我认为我的问题很接近() - 具体,可能是阅读和写作之间的区别......

6 个答案:

答案 0 :(得分:8)

使用using构造,您将在代码块末尾自动调用IDisposable.Dispose,这将关闭文件。如果您不使用using语句,则必须自己调用Close。

使用using,您还可以自动获得内置的try / finally异常处理功能,如果在退出using块之前出现问题,它将更加优雅。这是使用using的另一个原因是一个好主意而不是自己滚动。

在您的情况下,using构造是:

的简写
StreamWriter file2 = new System.IO.StreamWriter(myFilePath);
try
{
   newFileContents.ForEach(file2.WriteLine);
}
finally
{
   if (file2!= null)
       ((IDisposable)file2).Dispose();
}

如果您反编译StreamWriter的Dispose实现,您将看到此调用(以及其他):

this.stream.Close();
在finally块中的

(如果你需要绝对证据; - )

答案 1 :(得分:2)

OpenText返回StreamReader,继承TextReader,继承IDisposable接口,指定Dispose()方法。

using语句超出范围时,它会调用StreamReader的Dispose()实现上的Dispose()方法,然后关闭流(即底层文件)整个事情都包含在封面下的try / finally块,保证始终调用Dispose()。

答案 2 :(得分:0)

using结构在到达脚本块的末尾时调用对象的Dispose方法。此方法关闭文件。

每次使用文件时,都需要确保调用Dispose或Close,以便让Windows知道该文件可以免费编辑。

答案 3 :(得分:0)

  

我想知道是否有必要在以下情况下调用Close()(如果没有必要,为什么?)

否,因为using语句处理了对象 - 因此删除了非托管资源。

  

我认为在以下情况下有必要

是的,这里需要清理非托管资源。

答案 4 :(得分:0)

正确。

  1. 如果包含在using子句中,则不需要file.Close()
  2. 如果没有换行,您需要对Close()Dispose()
  3. 负责

答案 5 :(得分:0)

这不是必要因为Dispose()将关闭基础文件。但是,由于这是一个实现细节,因此在完成流后显式调用Close()是个好习惯。