Почему мой объект FileStream удаляется, когда я "использую" объект BinaryReader?
Рассмотрим следующую функцию:
private int GetSomethingFromFile(FileStream fs)
{
using (BinaryReader br = new BinaryReader(fs))
{
fs.Seek(0, SeekOrigin.Begin);
return br.ReadInt32();
}
}
Объект FileStream передается в качестве параметра, а BinaryReader объявляется с помощью оператора using. Когда я пытаюсь использовать этот объект FileStream, после вызова этой функции он вызывает исключение System.ObjectDisposedException. Почему этот объект FileStream удаляется вместе с объектом BinaryReader?
2 ответа
Это очень хороший вопрос, и я не знаю, почему было решено, что так и должно быть, но, увы, это задокументировано так:
Класс BinaryReader
Закрыть: закрывает текущий читатель и основной поток.
Если вы проверите этот ответ на вопрос Как мне "раскошелиться" на поток в.NET? затем вы увидите, что он ссылается на класс NonClosingStreamWrapper в библиотеке с именем MiscUtil, которую @ Jon Skeet написал и которую можно использовать для обтекания потока, чтобы предотвратить его закрытие.
Вы бы использовали это так (для вашего примера):
private int GetSomethingFromFile(FileStream fs)
{
using (var wrapper = new NonClosingStreamWrapper(fs))
using (BinaryReader br = new BinaryReader(wrapper))
{
fs.Seek(0, SeekOrigin.Begin);
return br.ReadInt32();
}
}
Поскольку утилита двоичного считывателя удаляет его основной поток.
Вместо этого используйте "использование" в методе вызывающей стороны.
Причина произвольна: библиотека классов.NET реализована таким образом.