Compartilhar via


Capacidade máxima do MemoryStream atualizada e comportamento de exceção alterado

A MemoryStream classe agora impõe uma capacidade máxima de 0x7FFFFFC7 bytes, que é o comprimento máximo real de uma matriz de bytes com suporte pelo CLR. Além disso, o comportamento da exceção foi alterado ao tentar definir a capacidade ou o comprimento de um MemoryStream além desse máximo. Em vez de lançar um OutOfMemoryException, o MemoryStream agora lança um ArgumentOutOfRangeException para valores de comprimento ou capacidade inválidos.

Versão introduzida

.NET 11 Versão Prévia 1

Comportamento anterior

Anteriormente, MemoryStream permitia capacidades de até int.MaxValue (0x7FFFFFFF), o que poderia resultar em um OutOfMemoryException ao tentar alocar memória além do limite suportado pelo CLR de 0x7FFFFFC7.

Ao definir a capacidade ou o comprimento de um MemoryStream para um valor maior que o limite com suporte, uma OutOfMemoryException foi lançada.

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

Novo comportamento

A partir do .NET 11, MemoryStream impõe uma capacidade máxima de 0x7FFFFFC7 bytes. A tentativa de definir a capacidade ou o comprimento além desse limite lança um ArgumentOutOfRangeException.

O tipo de exceção para valores de capacidade ou comprimento inválidos foi alterado de OutOfMemoryException para ArgumentOutOfRangeException.

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

Tipo de mudança disruptiva

Essa alteração é uma mudança comportamental.

Motivo da alteração

Esta alteração foi introduzida para alinhar o comportamento de MemoryStream com os limites reais de alocação de memória do CLR. O comportamento anterior permitia que os desenvolvedores especificassem capacidades ou comprimentos que excedessem o limite com suporte, levando a falhas de runtime com exceções menos descritivas (OutOfMemoryException). Ao limitar a capacidade máxima e lançar ArgumentOutOfRangeException, a alteração melhora a confiabilidade do tempo de execução e fornece feedback mais claro aos desenvolvedores.

Examine qualquer código que defina a capacidade ou o comprimento de um MemoryStream para garantir que ele não exceda a capacidade máxima com suporte.

Se o seu código estava tratando OutOfMemoryException ao lidar com operações de capacidade ou comprimento MemoryStream, você deve atualizá-lo para também tratar ArgumentOutOfRangeException, uma vez que ambas as exceções ainda podem ocorrer.

  • ArgumentOutOfRangeException é gerado ao tentar definir uma capacidade ou comprimento inválido, que exceda o máximo permitido.
  • OutOfMemoryException ainda poderá ser lançada se não houver memória suficiente disponível na máquina.
var stream = new MemoryStream();
try
{
    stream.SetLength(someLength);
}
catch (ArgumentOutOfRangeException)
{
    // Handle invalid capacity/length scenario.
}
catch (OutOfMemoryException)
{
    // Handle out of memory scenario.
}

Você também pode adicionar uma verificação antes de definir a capacidade ou o comprimento para evitar a exceção:

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

APIs afetadas