4

次の関数について考えてみます。

    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オブジェクトと一緒に破棄されるのはなぜですか?

4

2 に答える 2

8

これは非常に良い質問であり、なぜこれがどうあるべきかが決定された理由はわかりませんが、残念ながら、次のように文書化されています。

BinaryReaderクラス

閉じる:現在のリーダーと基になるストリームを閉じます。

質問に対するこの回答を確認すると、.NETでストリームを「フォーク」するにはどうすればよいですか。次に、@ Jon Skeetが作成したMiscUtilというライブラリのNonClosingStreamWrapperというクラスを参照していることがわかります。このクラスを使用して、ストリームが閉じられないようにラップアラウンドできます。

あなたはそれをこのように使うでしょう(あなたの例のために):

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();
    }
}
于 2011-03-10T14:36:39.777 に答える
1

バイナリリーダーを破棄すると、その基になるストリームが破棄されるためです。

代わりに、呼び出し元のメソッドで「using」を使用してください。

理由は任意です。.NETクラスライブラリはこのように実装されています。

于 2011-03-10T14:37:31.593 に答える