Dado que un MemoryStream es esencialmente un conjunto de bytes con un índice (y algunos otros miembros de soporte), borrar el conjunto de bytes y restablecer el índice se puede considerar restablecer y borrar el MemoryStream. Si el estado inicial de un MemoryStream es una matriz de puesta a cero con una posición de cero, entonces un ejemplo de un restablecimiento MemoryStream puede ser:
public static void Clear(this MemoryStream source)
{
byte[] buffer = source.GetBuffer();
Array.Clear(buffer, 0, buffer.Length);
source.Position = 0;
source.SetLength(0);
}
Es incorrecto decir que MemoryStream.SetLength solamente restablece o borra la MemoryStream desde SetLength solo borra la matriz de búfer interna si la longitud excede la longitud actual del búfer.
La reinicialización de un MemoryStream es un enfoque válido pero menos eficiente. Un beneficio de reiniciar el MemoryStream sería garantizar que el flujo nunca se cerró. Una vez que MemoryStream está cerrado, ya no se puede cambiar. Si puede asegurarse de que la instancia de MemoryStream no se cierre, borrar el buffer puede ser el camino a seguir.
** Solo para aclarar esta pregunta. ** Creo que se pregunta qué método impide que se asigne la memoria. En teoría, 'SetLength (0)' debe retener 'Capacity' al asignar un' nuevo MemoryStream() 'debería liberar esta memoria y asignar nueva. Dependiendo del uso, es posible que desee preservar la memoria y simplemente restablecer 'Longitud' y' Posición' de la secuencia. * (de todos modos, así es como pensaría un programador de C++ consciente de la memoria) * – CodeAngry
** Y el código del OP es legítimo. ** '.Capacity' permanece después de esas instrucciones, así que es la mejor manera de evitar un free/alloc cuando no es necesario . – CodeAngry