重置或清除.NET MemoryStream

48 .net memorystream

.NET MemoryStream似乎没有.Reset或.Clear方法.

我正在考虑使用以下代码来完成此任务:

ms.Seek(0, IO.SeekOrigin.Begin)
ms.SetLength(0)
Run Code Online (Sandbox Code Playgroud)

清除或重置现有.NET MemoryStream的正确方法是什么?

And*_*zub 73

为什么需要重置内存流?你总能创造一个新的.或者您可以使用:

memoryStream.SetLength(0);
Run Code Online (Sandbox Code Playgroud)

  • 创建新的内存流会导致分配。有些程序对性能很敏感,每个分配都很重要。 (3认同)

Ran*_*Ian 21

由于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);
}
Run Code Online (Sandbox Code Playgroud)

说MemoryStream.SetLength单独重置或清除MemoryStream是不正确的,因为如果长度超过当前缓冲区的长度,SetLength只清除内部缓冲区数组.

重新初始化MemoryStream是一种有效的方法,但效率较低.重新初始化MemoryStream的一个好处是保证流永远不会关闭.关闭MemoryStream后,将无法再更改它.如果您可以确保MemoryStream实例未关闭,那么清除缓冲区可能就是您的选择.

  • 调用`source.GetBuffer()`时,总是会得到有效的非空流的异常:_MemoryStream的内部缓冲区无法访问_。** upd **:此处说明了原因:http://stackoverflow.com/a/1646219/44217 (2认同)

omg*_*bah -5

内存流没有重置/清除方法,因为它是多余的。通过将其设置为零长度,您可以清除它。

当然,你总是可以这样做:

memoryStream = new MemoryStream(memoryStream.Capacity());
Run Code Online (Sandbox Code Playgroud)

这将产生一个与初始化大小相同的内存流。

如果您确实想手动清除流,我怀疑您将不得不诉诸循环元素。

  • -1 当您可以“.SetLength(0);”并保留容量时,为什么要创建具有相同容量的新流?行动中的内存滥用。 (27认同)