次の方法で共有


MemoryStream の最大容量の更新と例外動作の変更

MemoryStream クラスでは、CLR でサポートされているバイト配列の実際の最大長である、0x7FFFFFC7 バイトの最大容量が適用されるようになりました。 さらに、 MemoryStreamの容量または長さをこの最大値を超えて設定しようとすると、例外の動作が変更されました。 OutOfMemoryExceptionをスローする代わりに、MemoryStreamは無効な容量または長さの値のArgumentOutOfRangeExceptionをスローするようになりました。

導入されたバージョン

.NET 11 Preview 1

以前の動作

以前MemoryStream、最大int.MaxValue (0x7FFFFFFF) の容量が許可されていたため、CLR でサポートされているOutOfMemoryExceptionの制限を超えてメモリを割り当てようとしたときに0x7FFFFFC7が発生する可能性があります。

MemoryStreamの容量または長さをサポートされている上限を超える値に設定すると、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 の容量または長さを設定するコードを確認します。

OutOfMemoryException容量または長さの操作を操作するときにコードがMemoryStreamをキャッチしていた場合は、両方の例外が引き続き発生する可能性があるため、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