如何正确处理File.OpenRead()。我当前正在使用以下代码?

using (BinaryReader br = new BinaryReader(File.OpenRead(path)))
{
   myByte = br.ReadByte();
}

分析代码时,我在Visual Studio中得到以下内容:

最佳答案

乍看之下,这看起来像是误报,因为处理BinaryReader还会处理FileStream返回的File.OpenRead:

来自:http://msdn.microsoft.com/en-us/library/azy2k2bx.aspx



但是,有一种极端的情况,实际上并未处理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
}

如果您忘记了这一点,则您的流可能不会包含使用StreamWriter编写的所有内容。

09-13 14:05