62

.NET MemoryStream には、.Reset または .Clear メソッドがないようです。

これを達成するために次のコードを使用することを考えていました。

ms.Seek(0, IO.SeekOrigin.Begin)
ms.SetLength(0)

既存の .NET MemoryStream をクリアまたはリセットする適切な方法は何ですか?

4

4 に答える 4

92

なぜメモリストリームをリセットする必要があるのですか? いつでも新しいものを作成できます。または、次を使用できます。

memoryStream.SetLength(0);
于 2010-03-17T13:13:58.503 に答える
30

MemoryStream は基本的にインデックス (およびその他のサポート メンバー) を持つバイト配列であるため、バイト配列をクリアしてインデックスをリセットすることは、MemoryStream をリセットしてクリアすることと見なすことができます。MemoryStream の初期状態が、位置がゼロのゼロ化された配列である場合、MemoryStream のリセットの例は次のようになります。

public static void Clear(this MemoryStream source)
{
  byte[] buffer = source.GetBuffer();
  Array.Clear(buffer, 0, buffer.Length);
  source.Position = 0;
  source.SetLength(0);
}

SetLength は、現在のバッファーの長さを超える場合にのみ内部バッファー配列をクリアするため、MemoryStream.SetLength だけで MemoryStream をリセットまたはクリアすると言うのは正しくありません。

MemoryStream の再初期化は有効な方法ですが、効率が低下します。MemoryStream を再初期化する利点の 1 つは、ストリームが閉じられていないことを保証できることです。MemoryStream が閉じられると、変更できなくなります。MemoryStream インスタンスが閉じられていないことを確認できる場合は、バッファをクリアすることをお勧めします。

于 2012-03-31T17:33:15.717 に答える
-2

メモリストリームには、冗長になるため、リセット/クリア メソッドがありません。長さをゼロに設定すると、クリアされます。

もちろん、いつでもできます:

memoryStream = new MemoryStream(memoryStream.Capacity());

これにより、初期化されたのと同じサイズのメモリストリームが生成されます。

ストリームを手動でクリアしたい場合は、要素をループする必要があると思います。

于 2010-03-17T13:59:26.193 に答える