C# 如何处置File.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)”未被释放 沿着所有异常路径。呼叫 对象上的

如何正确处理文件.OpenRead()。我目前正在使用以下代码

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似乎是这样的太好了!我以前一直在抑制代码分析消息,但还是忍不住觉得…脏兮兮的。