На первый взгляд это выглядит как ложный положительный результат, потому что удаление BinaryReader
также избавит от FileStream
, возвращаемого File.OpenRead
:
От: http://msdn.microsoft.com/en-us/library/azy2k2bx.aspx
Если параметр распоряжения имеет значение true, этот метод освобождает все ресурсы, удерживаемые любыми управляемыми объектами, на которые ссылается этот BinaryReader.Этот метод вызывает метод Dispose для каждого объекта, на который есть ссылка.
Однако существует один угловой случай, когда FileStream
действительно не удаляется: когда конструктор BinaryReader
выдает исключение!
Решение:
Правильный способ написания вашего кода будет выглядеть следующим образом:
using (var fs = File.OpenRead(path))
{
BinaryReader br = new BinaryReader(fs);
myByte = br.ReadByte();
}
Справочная информация:
BinaryReader
содержит только ссылку наFileStream
и, следовательно, не нуждается в утилизации.
Code Analysis разделяет это мнение.
Кстати: при использовании этого решения для потока с возможностью записи важно очистить устройство записиперед удалением потока:
using (var fileStream = new FileStream(...))
{
var writer = new StreamWriter(fileStream);
writer.WriteLine(...);
writer.Flush(); // <-- Important
}
Если вы забудете об этом, ваш поток может не содержать всего, что было написано с использованием StreamWriter
.