1

だから私はコードを持っていて、それは次のようになります、

 using (MemoryStream mStream = new MemoryStream())
     {
       MemoryStream fileStream = new MemoryStream();
     }

両方にメモリ ストリームを割り当てますが、どちらも非常に大きくなる可能性があります。ネストされたメモリ ストリームは using 句内でしかアクセスできないことはわかっていますが、これによりメモリ リークが発生したり、コードが実行された後でもこのメモリ ストリームがメモリ内に残ったりするのではないかと心配しています。これを GB ファイルで使用しても安全ですか?

PS: この質問が明白またはばかげている場合は申し訳ありません。私はこの問題について初心者です。

4

3 に答える 3

2

実装するクラスを使用する場合は、使用が終了したらすぐにメソッドをIDisposable呼び出してDispose、プログラムが不要になったリソースを解放できるようにする必要があります。

usingキーワードDisposeは、ステートメント ブロックの最後で指定されたオブジェクトを呼び出すことにより、これを処理します。ただし、指定されたオブジェクトのみが破棄されます。したがって、あなたの場合、mStreamオブジェクトは破棄されますが、fileStreamオブジェクトは破棄されません。ガベージコレクターがクリーンアップするまで、割り当てられたメモリスペースなどを使用してメモリに残ります。

最終的にはガベージ コレクターIDisposable処理しますが、実装するすべてのオブジェクトは、使い終わったらすぐに破棄することをお勧めします。このusingステートメントは役立ちますが、作成メソッドの範囲外でオブジェクトを使い続けたい場合があります。たとえばMemoryStream、メソッドから a を返したい場合でも、オブジェクトをある時点で破棄する必要があります。

どのクラスを使用して実装するかを学びIDisposable、それらを破棄する習慣を身につけてください。後で悲しみを救うでしょう。

于 2013-07-10T05:01:00.050 に答える
2

実際に 2 番目を適切に破棄するには、 sMemoryStreamをネストする必要があります。using

using (MemoryStream mStream = new MemoryStream())
using (MemoryStream fileStream = new MemoryStream())
{
    …
}

いずれにせよ、より多くのメモリが必要で、 への参照が残っていない場合MemoryStreamは、再利用されます。一方、すべてを一度にメモリに収めることは、実際のメモリとファイル サイズの問題にすぎません…</p>

于 2013-07-10T02:31:47.713 に答える
0

以下を使用する必要があります。

using (MemoryStream mStream = new MemoryStream())
{
    //Don't name this a fileStream if it's actually a MemoryStream?
    using(MemoryStream fileStream = new MemoryStream())
    {
    }
}
于 2013-07-10T02:32:23.680 に答える