1

ストリームを別のストリームに割り当てて以下のように破棄しようとしているときに、例外に遭遇しました

Stream str = new FileStream(somefile, FileMode.OpenOrCreate);
Stream newstr = str;
str.Dispose(); // I disposed only str and not new str

byte[] b = new byte[newstr.Length];// got exception here stating unable to access closed stream...

どうして......?私は C# が初めてで、StreamwhereStreamは namespace にありますSystem.IO

4

1 に答える 1

3

はい、 を呼び出すとstr.DisposenewStrも破棄されます。これはStream、.NET のすべてのクラスと同様に、参照型であるためです。を書くときStream newstr = strは、新しい を作成するのではなく、同じStreamへの新しい参照を作成するだけです。 Stream

これを書く正しい方法は次のようになります。

Stream str = new FileStream(somefile, FileMode.OpenOrCreate);
int strLen = str.Length;
str.Dispose(); 

byte[] b = new byte[strLen];

これにより、 が回避されますObjectDisposedExceptionint値の型であることに注意してください。したがって、書き込むときint strLen = str.Length値の新しいコピーを作成し、それを変数に保存しますstrLen。したがって、Streamが破棄された後でも、その値を使用できます。

于 2013-07-02T05:38:25.807 に答える