Почему мой объект FileStream удаляется, когда я "использую" объект BinaryReader? - PullRequest
4 голосов
/ 10 марта 2011

Рассмотрим следующую функцию:

    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 ]

8 голосов
/ 10 марта 2011

Это очень хороший вопрос, и я не знаю, почему было решено, что так и должно быть, но, увы, задокументировано так:

BinaryReader класс

Закрыть : Закрывает текущий считыватель и основной поток .

Если вы прочитаете этот ответ на вопрос Как мне «разветвлять» поток в .NET? , тогда вы увидите, что он ссылается на класс NonClosingStreamWrapper в библиотека с именем MiscUtil , которую @ Джон Скит написал, которую можно использовать для обтекания потока, чтобы предотвратить его закрытие.

Вы бы использовали это так (для вашего примера):

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();
    }
}
1 голос
/ 10 марта 2011

Поскольку утилита двоичного считывателя удаляет его основной поток.

Вместо этого используйте «using» в методе вызывающего абонента.

Причина произвольна: библиотека классов .NET реализована таким образом.

...