File.Create查询

时间:2015-04-15 09:43:07

标签: c# file io

我最近遇到了this post,其中标记的答案是Jon Skeet。 在其中,他解释了创建空文件的不同方法,例如:

using (File.Create(filename)) ;

using (File.Create(filename)) {}

File.Create(filename).Dispose();

然后还有人们推荐使用的另一种方式:

File.Create(filename).Close();

现在Jon回答了一些关于使用哪一个以及为什么等等的详细信息。但是答案已经过时/过时并没有我想要的哪个细节可以更好地确保文件关闭,为什么。

1 个答案:

答案 0 :(得分:2)

答案绝对不是过时的。您可以通过对公开参考source codeFileStream.Dispose方法的实际实施进行一些研究来检查,Dispose的{​​{1}}方法将执行调用到FileStream,并执行许多其他操作。

handle.Dispose类不会覆盖在其基类中实现的虚拟Stream.Close()方法的实现。此基类目前只调用虚拟FileStream,从而导致相同的路径。

正如Close方法的文档中所述:

  

此方法调用Dispose,指定true以释放所有资源。   您不必专门调用Close方法。相反,确保   每个Stream对象都已正确处理。你可以声明Stream   使用块(或在Visual Basic中使用块)中的对象   确保流或其所有资源都被处理掉,或者您   可以显式调用Dispose方法。

尽管如此,当您使用Dispose(true)实例时,您应始终致电Dispose 1 (现在或在某些情况下)未来的时间)除文件句柄外还保留其他内部资源,如果您只在IDisposable实例上调用Close,则将被释放。

话虽这么说,确保正确处理的静态文件创建方法(如FileStreamFile.WriteAllBytes)也可以。但是 - 在我看来 - 这些感觉很尴尬,并没有很好地表达意图。

在一个名为File.WriteAllText的静态方法中,或者使用原始答案中建议的单个方法CreateEmptyFile的静态类EmptyFile中包含此内容,可以明确表达您的意图。

1 这应理解为直接调用Create或(最好)将资源包装在Dispose块中。