我想知道是否有必要在以下情况下拨打Close()
(如果没有必要,为什么?)
using (var file = System.IO.File.OpenText(myFilePath))
{
...
}
我认为在以下情况下有必要
StreamWriter file2 = new System.IO.StreamWriter(myFilePath);
newFileContents.ForEach(file2.WriteLine);
file2.Close();
这是对的吗?
修改
我认为我的问题很接近() - 具体,可能是阅读和写作之间的区别......
答案 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)
正确。
file.Close()
Close()
和Dispose()
答案 5 :(得分:0)
这不是必要因为Dispose()
将关闭基础文件。但是,由于这是一个实现细节,因此在完成流后显式调用Close()
是个好习惯。