什么时候是file.close()必要的?
我在想,如果有必要在以下情况下调用它Close()
(如果没有必要,为什么?)什么时候是file.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自己。
With using
如果在退出using
块之前出现问题,您还会自动获取内置的try/finally异常处理功能,该功能将更加优雅。这是使用using
是一个好主意,而不是滚动你自己的另一个原因。
在你的情况using
结构是简写:
StreamWriter file2 = new System.IO.StreamWriter(myFilePath);
try
{
newFileContents.ForEach(file2.WriteLine);
}
finally
{
if (file2!= null)
((IDisposable)file2).Dispose();
}
如果你反编译的StreamWriter的实施处置,你会看到这个调用(其中包括):
this.stream.Close();
在finally块
(如果您需要绝对证明;-)
最后,我可以upvote的答案。请注意''IDisposable'接口是在'TextWriter'中指定的,StreamWriter'继承 – 2013-02-27 19:12:48
'使用()'是try/finally的简写,但是,finally块调用'Dispose()' – 2013-02-27 19:14:49
我会注意到你对*的解释“使用结构是速记的:”*是错误的。从概念上讲,这很好,但你忘了'try/finally',这真的是最重要的部分。 – 2013-02-27 19:15:21
使用结构在到达脚本块末尾时调用对象的Dispose方法。此方法关闭文件。
无论何时您使用某个文件,您都需要确保调用Dispose或Close以让Windows知道该文件可以进行编辑。
我在想,如果有必要把它关闭()在下列情况下(如果没有必要,为什么?)
没有因为using
声明对象的部署 - 从而消除非托管资源。
我相信它是在下列情况下
是的,这里就需要使非托管资源清理必要的。
正确。
- 如果包裹在使用子句,
file.Close()
不需要 - 如果不换,你是负责
Close()
和Dispose()
这是没有必要因为Dispose()
将关闭底层的文件。但是,由于这是一个实现细节,所以在完成流时明确呼叫Close()
是一种好的做法。
OpenText返回StreamReader
,它继承TextReader
,其继承了IDisposable
接口,其指定一个Dispose()
方法。
当using
语句超出范围时,它会在StreamReader的Dispose()实现上调用Dispose()方法,这会依次关闭流(即底层文件)。整个事件被封装在try
/finally
,它保证了Dispose()将始终被调用。
到目前为止,我还没有看到一个值得我赞赏的答案。 – 2013-02-27 19:11:19
第二个代码片段不正确,代码抛出异常时将无法关闭文件。 Close()作为单独的方法存在,主要是因为* using *语句并不总是合适的。有时你可能想要保持文件打开一段时间,超出一种方法。 – 2013-02-27 19:14:14
@RobertHarvey:没有答案会被给予值得赞赏,因为所有的答案都已经给出(包括我的):) http://*.com/questions/278902/using-statement-vs-try-终于 http://*.com/questions/567138/when-should-i-use-using-blocks-in-c/568231 http://*.com/questions/614959/using-the-using-在c-sharp中的陈述 – IAbstract 2013-02-27 19:16:11