Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
La MemoryStream classe applique désormais une capacité maximale d’octets 0x7FFFFFC7 , qui correspond à la longueur maximale réelle d’un tableau d’octets pris en charge par le CLR. En outre, le comportement de l’exception a changé lors de la tentative de définition d’une capacité ou d’une MemoryStreamlongueur au-delà de ce maximum. Au lieu de lever un OutOfMemoryException, le MemoryStream déclenche maintenant un ArgumentOutOfRangeException pour une capacité ou une longueur non valides.
Version introduite
.NET 11 Preview 1
Comportement précédent
Auparavant, MemoryStream permettait des capacités jusqu’à int.MaxValue (0x7FFFFFFF), ce qui pouvait entraîner une OutOfMemoryException lors d’une tentative d’allocation de mémoire au-delà de la limite de 0x7FFFFFC7 prise en charge par le CLR.
Lors de la définition de la capacité ou de la longueur d'un MemoryStream à une valeur supérieure à la limite prise en charge, une exception OutOfMemoryException a été levée.
var stream = new MemoryStream();
stream.SetLength(int.MaxValue); // Threw OutOfMemoryException.
Nouveau comportement
À compter de .NET 11, MemoryStream applique une capacité maximale d’octets 0x7FFFFFC7 . Toute tentative de réglage de la capacité ou de la longueur au-delà de cette limite lève un ArgumentOutOfRangeException.
Le type d’exception pour les valeurs de capacité ou de longueur non valides a changé de OutOfMemoryException à ArgumentOutOfRangeException.
var stream = new MemoryStream();
stream.SetLength(int.MaxValue); // Throws ArgumentOutOfRangeException.
Type de changement cassant
Ce changement est un changement de comportement.
Raison de la modification
Cette modification a été introduite pour aligner le comportement de MemoryStream avec les limites d’allocation de mémoire réelles du CLR. Le comportement précédent a permis aux développeurs de spécifier des capacités ou des longueurs qui ont dépassé la limite prise en charge, ce qui entraîne des échecs d’exécution avec moins d’exceptions descriptives (OutOfMemoryException). En limitant la capacité maximale et en lançant ArgumentOutOfRangeException, la modification améliore la fiabilité du temps d'exécution et fournit des retours plus clairs aux développeurs.
Action recommandée
Passez en revue tout code qui définit la capacité ou la longueur d’un MemoryStream pour vous assurer qu’elle ne dépasse pas la capacité maximale prise en charge.
Si votre code interceptait OutOfMemoryException lors de l'utilisation des opérations de capacité ou de longueur avec MemoryStream, vous devez le mettre à jour pour intercepter ArgumentOutOfRangeException également, car ces deux exceptions peuvent toujours se produire :
-
ArgumentOutOfRangeExceptionest levée lors de la tentative de définition d’une capacité ou d’une longueur non valide (dépassant le maximum). -
OutOfMemoryExceptionpeut toujours être levée en cas d’insuffisance de mémoire disponible sur l’ordinateur.
var stream = new MemoryStream();
try
{
stream.SetLength(someLength);
}
catch (ArgumentOutOfRangeException)
{
// Handle invalid capacity/length scenario.
}
catch (OutOfMemoryException)
{
// Handle out of memory scenario.
}
Vous pouvez également ajouter une vérification avant de définir la capacité ou la longueur pour éviter l’exception :
bool TrySetLength(MemoryStream stream, long length)
{
if (length > Array.MaxLength)
{
return false;
}
stream.SetLength(length);
return true;
}