Comparteix via


Se ha cambiado la capacidad máxima de MemoryStream y el comportamiento de excepción

La MemoryStream clase ahora aplica una capacidad máxima de 0x7FFFFFC7 bytes, que es la longitud máxima real de una matriz de bytes compatible con CLR. Además, el comportamiento de la excepción ha cambiado al intentar establecer la capacidad o la longitud de un MemoryStreamvalor superior a este máximo. En lugar de lanzar un OutOfMemoryException, el MemoryStream ahora lanza un ArgumentOutOfRangeException para valores de capacidad o longitud no válidos.

Versión introducida

.NET 11 Preview 1

Comportamiento anterior

Anteriormente, MemoryStream permitía capacidades de hasta int.MaxValue (0x7FFFFFFF), lo que podría dar lugar a un OutOfMemoryException al intentar asignar memoria más allá del límite admitido por el CLR de 0x7FFFFFC7.

Al establecer la capacidad o longitud de un MemoryStream a un valor mayor que el límite admitido, se lanzó un OutOfMemoryException.

var stream = new MemoryStream();
stream.SetLength(int.MaxValue); // Threw OutOfMemoryException.

Nuevo comportamiento

A partir de .NET 11, MemoryStream impone una capacidad máxima de 0x7FFFFFC7 bytes. Si se intenta establecer la capacidad o la longitud que supera este límite, se lanza una excepción ArgumentOutOfRangeException.

El tipo de excepción para los valores de capacidad o longitud no válidos ha cambiado de OutOfMemoryException a ArgumentOutOfRangeException.

var stream = new MemoryStream();
stream.SetLength(int.MaxValue); // Throws ArgumentOutOfRangeException.

Tipo de cambio disruptivo

Este es un cambio de comportamiento.

Motivo del cambio

Este cambio se introdujo para alinear el comportamiento de MemoryStream con los límites de asignación de memoria reales del CLR. El comportamiento anterior permitía a los desarrolladores especificar capacidades o longitudes que superaban el límite admitido, lo que provocaba errores en tiempo de ejecución con excepciones menos descriptivas (OutOfMemoryException). Al limitar la capacidad máxima y lanzar ArgumentOutOfRangeException, el cambio mejora la confiabilidad del tiempo de ejecución y proporciona comentarios más claros a los desarrolladores.

Revise cualquier código que establezca la capacidad o la longitud de un MemoryStream para asegurar que no supere la capacidad máxima admitida.

Si su código capturaba OutOfMemoryException al trabajar con operaciones de capacidad o longitud de MemoryStream, debe actualizarlo para que también capture ArgumentOutOfRangeException, ya que ambas excepciones todavía pueden producirse.

  • ArgumentOutOfRangeException se lanza al intentar establecer una capacidad o longitud no válidas (superando el máximo).
  • OutOfMemoryException todavía se puede lanzar si no hay memoria suficiente disponible en el equipo.
var stream = new MemoryStream();
try
{
    stream.SetLength(someLength);
}
catch (ArgumentOutOfRangeException)
{
    // Handle invalid capacity/length scenario.
}
catch (OutOfMemoryException)
{
    // Handle out of memory scenario.
}

También puede agregar una comprobación antes de establecer la capacidad o longitud para evitar la excepción:

bool TrySetLength(MemoryStream stream, long length)
{
    if (length > Array.MaxLength)
    {
        return false;
    }
    
    stream.SetLength(length);
    return true;
}

Las APIs afectadas