C# 如何处置File.OpenRead()
如何正确处理文件.OpenRead()。我目前正在使用以下代码C# 如何处置File.OpenRead(),c#,dispose,C#,Dispose,如何正确处理文件.OpenRead()。我目前正在使用以下代码 using (BinaryReader br = new BinaryReader(File.OpenRead(path))) { myByte = br.ReadByte(); } 在分析代码时,我在Visual Studio中获得以下信息: 警告1:CA2000: 可靠性:在方法上 “Program.Main(string[])”,对象 “File.OpenRead(path)”未被释放 沿着所有异常路径。呼叫 对象上的
using (BinaryReader br = new BinaryReader(File.OpenRead(path)))
{
myByte = br.ReadByte();
}
在分析代码时,我在Visual Studio中获得以下信息:
警告1:CA2000:
可靠性:在方法上
“Program.Main(string[])”,对象
“File.OpenRead(path)”未被释放
沿着所有异常路径。呼叫
对象上的System.IDisposable.Dispose
“File.OpenRead(path)”在所有
对它的引用超出范围
关于:
using (Filestream fs = File.OpenRead(Path))
{
using (BinaryReader br = new BinaryReader(fs))
{
myByte = br.ReadByte();
}
}
File.OpenRead返回一个FileStream,它也是IDispoble。如果愿意,您可以将其放入外部using块中,或者声明它并在当前using之外进行处理。乍一看,这看起来像是误报,因为处理
BinaryReader
也会处理文件返回的文件流。OpenRead
:
发件人:
当disposing参数为true时,此方法释放此BinaryReader引用的任何托管对象所持有的所有资源。此方法调用每个被引用对象的Dispose方法
然而,有一种情况是,FileStream
实际上没有被处理:当BinaryReader
的构造函数抛出异常时
解决方案:
编写代码的正确方法如下:
using (var fs = File.OpenRead(path))
{
BinaryReader br = new BinaryReader(fs);
myByte = br.ReadByte();
}
背景:
BinaryReader
只保存对FileStream
的引用,因此不需要处理。
代码分析也同意这一观点
顺便说一句:当对可写流使用此解决方案时,在处理流之前刷新写入程序非常重要:
using (var fileStream = new FileStream(...))
{
var writer = new StreamWriter(fileStream);
writer.WriteLine(...);
writer.Flush(); // <-- Important
}
使用(var fileStream=newfilestream(…)
{
var writer=newstreamwriter(fileStream);
作家,作家(…);
writer.Flush();//需要释放File.OpenRead创建的文件流和在该文件流上创建的BinaryReader,因此需要对每个文件流进行显式引用:
using(FileStream fs = File.OpenRead(path))
using(BinaryReader br = new BinaryReader(fs))
{
myByte = br.ReadByte();
}
简单明了,一切都应该如此。为了简洁起见,您甚至可以舍弃所有外部括号(但这是主观的)。这会返回另一个警告:警告1 CA2202:Microsoft。用法:对象“fs”可以在方法“Program.Main”(字符串[])中多次处理“。为了避免生成System.ObjectDisposedException,您不应该对一个对象多次调用Dispose。:行:24+1,很好。文档中的示例读起来像问题中的代码:File.Open
的结果没有显式处理。是的,这也是我喜欢的想法。最后,Microsoft似乎是这样的太好了!我以前一直在抑制代码分析消息,但还是忍不住觉得…脏兮兮的。