7

MemoryStream は管理されていないリソースであるため、常に破棄する必要がありますか?

与えられた:

1) A method is invoked.
2) A MemoryStream object is created (MemoryStream ms = new MemoryStream();).
3) An exception occurs and is caught from the invoking classes.

したがって、MemoryStream オブジェクトの参照は失われます。このシナリオには、try/finally ブロック (または using ステートメント) が必要ですか?

4

4 に答える 4

17

一般に、すべての破棄可能なオブジェクトは常に破棄する必要があります。

ただし、MemoryStream管理されていないリソースがないため、実際に破棄する必要はありません。(それはただの abyte[]と anですint)
そもそもそれが使い捨てである唯一の理由は、それがStreamを実装する抽象クラスを継承するからIDisposableです。

他のすべてのストリームを破棄する必要があることに注意してください。

于 2010-11-16T15:31:08.407 に答える
3

実装するすべての型は、try/catch/finally ブロックまたは using ステートメントを介して明示的に呼び出すIDisposable必要があります。Dispose

このようなケースでは、技術的にMemoryStreamは を破棄する必要はありませんが、インターフェイスを尊重し、ダウンストリームの変更から身を守るためには、Dispose引き続き を呼び出す必要があります。

于 2010-11-16T15:28:42.870 に答える
1

MemoryStream可能であればIDisposable、using ステートメントを使用してください。

それが不可能な場合は、try/catch/finally ブロックにします。

オブジェクトをコードのスコープ外に渡す必要がある場合 (または try/catch/finally を使用しない場合)、明示的な破棄を実装するのは呼び出し元の責任になります。

于 2010-11-16T15:29:48.723 に答える
-1

ここを参照してくださいUsing ステートメントの問題の回避

ILを見て、usingこれを行います:

try
{
}finally
{
((System.IDisposable)obj).Dispose();
}

つまり、ストリームは何があっても破棄されますが、例外 (try ブロックで発生した場合) はスタックに残るため、注意しないとアプリがクラッシュする可能性があります。

したがって、「したがって、MemoryStream オブジェクトの参照は失われます。このシナリオには、try/finally ブロック (または using ステートメント) が必要ですか?」- それは同じだ

Dispose メソッドが何らかの理由で失敗した場合に何が起こるかは、非常に興味深いことです。IE のセキュリティ ホールが発生します :) 冗談です :)

于 2010-11-16T15:34:50.217 に答える