我最近遇到了this post,其中标记的答案是Jon Skeet。 在其中,他解释了创建空文件的不同方法,例如:
using (File.Create(filename)) ;
using (File.Create(filename)) {}
File.Create(filename).Dispose();
然后还有人们推荐使用的另一种方式:
File.Create(filename).Close();
现在Jon回答了一些关于使用哪一个以及为什么等等的详细信息。但是答案已经过时/过时并没有我想要的哪个细节可以更好地确保文件关闭,为什么。
答案 0 :(得分:2)
答案绝对不是过时的。您可以通过对公开参考source code中FileStream.Dispose
方法的实际实施进行一些研究来检查,Dispose
的{{1}}方法将执行调用到FileStream
,并执行许多其他操作。
handle.Dispose
类不会覆盖在其基类中实现的虚拟Stream.Close()
方法的实现。此基类目前只调用虚拟FileStream
,从而导致相同的路径。
正如Close方法的文档中所述:
此方法调用Dispose,指定true以释放所有资源。 您不必专门调用Close方法。相反,确保 每个Stream对象都已正确处理。你可以声明Stream 使用块(或在Visual Basic中使用块)中的对象 确保流或其所有资源都被处理掉,或者您 可以显式调用Dispose方法。
尽管如此,当您使用Dispose(true)
实例时,您应始终致电Dispose
1 (现在或在某些情况下)未来的时间)除文件句柄外还保留其他内部资源,如果您只在IDisposable
实例上调用Close
,则不将被释放。
话虽这么说,确保正确处理的静态文件创建方法(如FileStream
或File.WriteAllBytes
)也可以。但是 - 在我看来 - 这些感觉很尴尬,并没有很好地表达意图。
在一个名为File.WriteAllText
的静态方法中,或者使用原始答案中建议的单个方法CreateEmptyFile
的静态类EmptyFile
中包含此内容,可以明确表达您的意图。
1 这应理解为直接调用Create
或(最好)将资源包装在Dispose
块中。