Сбросить или очистить .NET MemoryStream - PullRequest
44 голосов
/ 17 марта 2010

.NET MemoryStream не имеет метода .Reset или .Clear.

Я думал об использовании следующего кода для достижения этой цели:

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

Как правильно очистить или сбросить существующий .NET MemoryStream?

Ответы [ 3 ]

71 голосов
/ 17 марта 2010

Зачем вам нужно сбросить поток памяти?Вы всегда можете создать новый.Или вы можете использовать:

memoryStream.SetLength(0);
20 голосов
/ 31 марта 2012

Поскольку 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);
}

Неправильно говорить, что только MemoryStream.SetLength сбрасывает или очищает MemoryStream, поскольку SetLength очищает массив внутреннего буфера, только если длина превышает длину текущего буфера.

Реинициализация MemoryStream - это правильный подход, но менее эффективный. Одним из преимуществ повторной инициализации MemoryStream будет гарантия того, что поток никогда не будет закрыт. После закрытия MemoryStream его уже нельзя изменить. Если вы можете быть уверены, что экземпляр MemoryStream не закрыт, то очистка буфера может помочь.

2 голосов
/ 17 марта 2010

Поток памяти не имеет метода сброса / сброса, поскольку он будет избыточным. Установив нулевую длину, вы очищаете его.

Конечно, вы всегда можете сделать:

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

Это даст вам поток памяти того же размера, который инициализирован.

Если вы действительно хотите очистить поток вручную, я подозреваю, что вам придется прибегнуть к циклическому прохождению элементов.

...