C# 创建查询
我最近遇到了Jon Skeet的显著答案。 在其中,他解释了创建空文件的不同方法,例如:C# 创建查询,c#,file,io,C#,File,Io,我最近遇到了Jon Skeet的显著答案。 在其中,他解释了创建空文件的不同方法,例如: using (File.Create(filename)) ; using (File.Create(filename)) {} File.Create(filename).Dispose(); 此外,人们还建议使用另一种方法: File.Create(filename).Close(); 现在Jon的答案详细说明了使用哪一个以及原因等。但是答案已经过时/过时,没有我想要的那么多关于哪一个更适合确保
using (File.Create(filename)) ;
using (File.Create(filename)) {}
File.Create(filename).Dispose();
此外,人们还建议使用另一种方法:
File.Create(filename).Close();
现在Jon的答案详细说明了使用哪一个以及原因等。但是答案已经过时/过时,没有我想要的那么多关于哪一个更适合确保文件关闭以及为什么关闭的细节 答案肯定不是过时的。您可以通过对公开引用中
FileStream.Dispose
方法的实际实现进行一些研究来检查FileStream
的Dispose
方法将执行对handle.Dispose
的调用,并执行许多其他操作
FileStream
类不会重写在其基类中实现的虚拟方法的实现。这个基类当前将只调用虚拟的Dispose(true)
,从而导致相同的路径
如方法文件中所述:
此方法调用,指定true以释放所有资源。
您不必专门调用Close方法。相反,要确保
确保每个流对象都被正确处理。您可以声明流
使用块(或Visual Basic中的使用块)中的对象
确保流及其所有资源已被释放,否则
可以显式调用Dispose方法
尽管如此,在使用IDisposable
实例时,您始终应该调用Dispose
1,因为它可能(现在或将来某个时候)持有文件句柄之外的其他内部资源,如果只在FileStream
实例上调用Close
,则不会发布该命令
也就是说,确保正确处理的静态文件创建方法,如file.writealBytes
或file.writealText
,也可以工作。但是——在我看来——这些感觉很尴尬,也不能很好地表达意图
按照原始答案中的建议,将其包装在名为CreateEmptyFile
的静态方法中,或者使用单个方法Create
将其包装在静态类EmptyFile
中,可以明确您的意图
1这应该理解为直接调用
Dispose
,或者(最好)使用块将资源包装在中。I有点像其他答案之一,使用带有空字符串的File.writealText
。在幕后,它的效率可能会稍低一些,但它将处理权留给了框架代码,而不需要显式地或通过任何形式的欺骗来调用。(如果我看到在生产代码中使用块方法,则可能需要两次尝试才能完全解决它。可能效率稍高一些,但这样的两次尝试可能会导致对代码行为和未来bug的误解。)是的,这是问这个问题的主要原因,因为我在一个遗留项目中发现了这些代码,并且正在研究它。然而,我自己发现这个例子中的WriteAllText方法更令人困惑。Jon最好的建议是用一个恰当命名的方法来包装整个过程。运行性能测试、竞态条件测试等,所有这些都是在测试完成后根据需要调整到字节(如果需要的话)。但是,只要功能存在于一个抽象的地方,并有一个好的名称,那么使用它的其他生产代码就会清晰易懂。我想,但主要是想知道每个功能的实际功能,因为在一个方法中使用它是很好的。但是,如果每次我们回到原点时都失败了,只需要更改更少的代码。我理解这一点,但是Dispose调用不总是有机会被调用吗?那么,在这种情况下,应该始终使用using吗?不管它看起来有多奇怪?在我看来,如果你通过调用某个类上的方法来请求一个一次性实例,你有责任调用它上的Dispose
。负责任的是的,但是自称的Dispose实际上不可能被调用吗?比如说,在线程化的情况下?像使用(File.Create(“abc.ext”),这样的调用中,线程相关的东西怎么会干扰呢代码>?这就是我要说的,你能不能不要那样做,而不要。处置?还是我误解了你的意思?