Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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.
Ação recomendada
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. -
OutOfMemoryExceptionainda 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;
}