共用方式為


MemoryStream 最大容量更新,例外行為改變

MemoryStream此類別現在強制執行最大位元組容量0x7FFFFFC7,即 CLR 支援的位元組陣列實際最大長度。 此外,當嘗試將 MemoryStream的容量或長度設定超過此最大值時,例外行為也有所改變。 現在不再拋出 OutOfMemoryException,而是當容量或長度值無效時,MemoryStream會拋出 ArgumentOutOfRangeException

推出的版本

.NET 11 預覽版 1

先前的行為

過去MemoryStream允許的容量最高可達int.MaxValue0x7FFFFFFF),而當嘗試分配超出 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;
}

受影響的 API