Почему мой объект 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 реализована таким образом.

Другие вопросы по тегам