什么时候需要 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();
正确吗?
编辑:
我以为我的问题很接近(( - 具体,可能是阅读和写作之间的区别......
使用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 知道该文件可以自由编辑。
正确。
- 如果包装在 using 子句中,则不需要
file.Close()
- 如果没有包装,您有责任
Close()
和Dispose()
我想知道在以下情况下是否有必要调用 Close(((如果没有必要,为什么?
否,因为 using
语句释放对象,从而删除非托管资源。
我认为在以下情况下是必要的
是的,这里需要清理非托管资源。
这不是必需的,因为Dispose()
将关闭基础文件。 但是,由于这是一个实现细节,因此最好在完成流时显式调用Close()
。