6

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

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

我认为在以下情况下是必要的

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

这是正确的吗?

编辑:

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

4

6 回答 6

11

使用该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 块中(如果您需要绝对证明 ;-)

于 2013-02-27T19:09:20.153 回答
2

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

using语句超出范围时,它会调用 StreamReader 的 Dispose() 实现上的 Dispose() 方法,进而关闭流(即底层文件)tryfinally保证 Dispose() 将始终被调用。

于 2013-02-27T19:12:29.937 回答
0

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

任何时候处理文件时,都需要确保调用 Dispose 或 Close 以让 Windows 知道该文件可以自由编辑。

于 2013-02-27T19:10:01.393 回答
0

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

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

我认为在以下情况下是必要的

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

于 2013-02-27T19:10:06.937 回答
0

正确的。

  1. 如果包含在 using 子句中,file.Close()则不需要a
  2. 如果未包装,您有责任Close()Dispose()
于 2013-02-27T19:10:06.920 回答
0

这不是必需的,因为Dispose()会关闭基础文件。Close()但是,由于这是一个实现细节,因此在完成流后显式调用是一种很好的做法。

于 2013-02-27T19:10:35.943 回答