什么时候需要 file.close()

本文关键字:close file 什么时候 | 更新日期: 2023-09-27 18:01:30

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

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

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

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

正确吗?

编辑:

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

什么时候需要 file.close()

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

有了using,您还可以自动获得内置的try/final异常处理,如果在退出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();

在最后块中(如果您需要绝对证明;-(

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

using 语句超出范围时,它会在 StreamReader 的 Dispose(( 实现上调用 Dispose(( 方法,进而关闭流(即底层文件(整个东西被包装在幕后的 try/finally 块中,这保证了 Dispose(( 将始终被调用。

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

每次处理文件时,都需要确保调用"处置"或"关闭",以便让 Windows 知道该文件可以自由编辑。

正确。

  1. 如果包装在 using 子句中,则不需要file.Close()
  2. 如果没有包装,您有责任Close()Dispose()

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

否,因为 using 语句释放对象,从而删除非托管资源。

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

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

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