.NET MemoryStream には、.Reset または .Clear メソッドがないようです。
これを達成するために次のコードを使用することを考えていました。
ms.Seek(0, IO.SeekOrigin.Begin)
ms.SetLength(0)
既存の .NET MemoryStream をクリアまたはリセットする適切な方法は何ですか?
.NET MemoryStream には、.Reset または .Clear メソッドがないようです。
これを達成するために次のコードを使用することを考えていました。
ms.Seek(0, IO.SeekOrigin.Begin)
ms.SetLength(0)
既存の .NET MemoryStream をクリアまたはリセットする適切な方法は何ですか?
なぜメモリストリームをリセットする必要があるのですか? いつでも新しいものを作成できます。または、次を使用できます。
memoryStream.SetLength(0);
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 インスタンスが閉じられていないことを確認できる場合は、バッファをクリアすることをお勧めします。
メモリストリームには、冗長になるため、リセット/クリア メソッドがありません。長さをゼロに設定すると、クリアされます。
もちろん、いつでもできます:
memoryStream = new MemoryStream(memoryStream.Capacity());
これにより、初期化されたのと同じサイズのメモリストリームが生成されます。
ストリームを手動でクリアしたい場合は、要素をループする必要があると思います。