Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Теперь класс MemoryStream применяет максимальную емкость 0x7FFFFFC7 байт, которая является фактической максимальной длиной массива байтов, поддерживаемого CLR. Кроме того, поведение исключения изменилось при попытке задать MemoryStream емкость или длину, превышающую этот максимум. Вместо того чтобы вызывать OutOfMemoryException, MemoryStream теперь бросает ArgumentOutOfRangeException при недопустимых значениях емкости или длины.
Представленная версия
.NET 11( предварительная версия 1)
Предыдущее поведение
Ранее MemoryStream разрешалось использование емкостей до int.MaxValue (0x7FFFFFFF), что может привести к OutOfMemoryException в попытке выделить память за пределами допустимого лимита, поддерживаемого средой CLR.
При установке емкости MemoryStream или длины MemoryStream на значение, превышающее поддерживаемое ограничение, было выброшено исключение OutOfMemoryException.
var stream = new MemoryStream();
stream.SetLength(int.MaxValue); // Threw OutOfMemoryException.
Новое поведение
Начиная с .NET 11, MemoryStream применяет максимальную емкость байтов 0x7FFFFFC7 . Попытка задать емкость или длину за пределами этого ограничения вызывает ArgumentOutOfRangeExceptionисключение.
Тип исключения для недопустимых значений емкости или длины изменился на OutOfMemoryExceptionArgumentOutOfRangeException.
var stream = new MemoryStream();
stream.SetLength(int.MaxValue); // Throws ArgumentOutOfRangeException.
Тип разрушающего изменения
Это изменение поведения.
Причина изменения
Это изменение было введено для выравнивания поведения MemoryStream с фактическими ограничениями выделения памяти CLR. Предыдущее поведение позволило разработчикам указывать емкость или длину, превышающую поддерживаемое ограничение, что приводит к сбоям среды выполнения с менее описательными исключениями (OutOfMemoryException). За счет ограничения максимальной емкости и генерации ArgumentOutOfRangeException, изменения повышают надежность среды выполнения и предоставляют более четкую обратную связь разработчикам.
Рекомендуемое действие
Проверьте любой код, задающий емкость или длину MemoryStream, чтобы убедиться, что задаваемые параметры не превышают максимальную поддерживаемую емкость.
Если ваш код перехватывал OutOfMemoryException при работе с операциями, связанными с емкостью или длиной, необходимо обновить его, чтобы также перехватывать ArgumentOutOfRangeException, так как оба исключения по-прежнему могут возникать.
-
ArgumentOutOfRangeExceptionвозникает при попытке задать недопустимую емкость или длину (превышающую максимальное значение). -
OutOfMemoryExceptionвсё ещё может быть выброшено, если на компьютере недостаточно памяти.
var stream = new MemoryStream();
try
{
stream.SetLength(someLength);
}
catch (ArgumentOutOfRangeException)
{
// Handle invalid capacity/length scenario.
}
catch (OutOfMemoryException)
{
// Handle out of memory scenario.
}
Можно также добавить проверку перед настройкой емкости или длины, чтобы избежать исключения:
bool TrySetLength(MemoryStream stream, long length)
{
if (length > Array.MaxLength)
{
return false;
}
stream.SetLength(length);
return true;
}