Подтвердить что ты не робот

Reset или очистить .NET MemoryStream

У .NET MemoryStream отсутствует метод .Reset или .Clear.

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

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

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

4b9b3361

Ответ 1

В memystream нет метода reset/clear, потому что он будет избыточным. Установив его на нулевую длину, вы очистите его.

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

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

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

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

Ответ 2

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

memoryStream.SetLength(0);

Ответ 3

Так как MemoryStream по существу является байтовым массивом с индексом (и некоторыми другими поддерживающими элементами), то очистка байтового массива и сброс индекса можно считать сбросом и очисткой MemoryStream. Если начальное состояние MemoryStream представляет собой обнуленный массив с позицией нуля, то пример MemoryStream reset может быть:

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 не закрыт, то очистка буфера может быть способом.