MemoryStream此類別現在強制執行最大位元組容量0x7FFFFFC7,即 CLR 支援的位元組陣列實際最大長度。 此外,當嘗試將 MemoryStream的容量或長度設定超過此最大值時,例外行為也有所改變。 現在不再拋出 OutOfMemoryException,而是當容量或長度值無效時,MemoryStream會拋出 ArgumentOutOfRangeException。
推出的版本
.NET 11 預覽版 1
先前的行為
過去MemoryStream允許的容量最高可達int.MaxValue(0x7FFFFFFF),而當嘗試分配超出 CLR 支援限制的記憶體0x7FFFFFC7時,可能導致OutOfMemoryException。
當將 a MemoryStream 的容量或長度設定為大於支援限制的值時,會拋出 a OutOfMemoryException 。
var stream = new MemoryStream();
stream.SetLength(int.MaxValue); // Threw OutOfMemoryException.
新行為
從 .NET 11 開始,MemoryStream 的最大容量被強制設為 0x7FFFFFC7 位元組。 嘗試將容量或長度設定超過此限制會產生 ArgumentOutOfRangeException。
對於無效容量或長度值的例外類型已從 OutOfMemoryException 變更為 ArgumentOutOfRangeException。
var stream = new MemoryStream();
stream.SetLength(int.MaxValue); // Throws ArgumentOutOfRangeException.
破壞性變更的類型
此變更為行為變更。
變更的原因
此變更是為了使MemoryStream的行為與 CLR 的實際記憶體配置限制保持一致。 先前的行為允許開發者指定超出支援限制的容量或長度,導致執行時失敗且例外描述性較低(OutOfMemoryException)。 透過限制最大容量並拋出 ArgumentOutOfRangeException,這項變更提升了執行時的可靠性,並為開發者提供更清晰的回饋。
建議的動作
檢視任何設定 MemoryStream 容量或長度的程式碼,以確保不會超過最大支援容量。
如果你的程式碼在使用 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;
}