Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Klassen MemoryStream tillämpar nu en maximal kapacitet på 0x7FFFFFC7 byte, vilket är den faktiska maximala längden på en bytematris som stöds av CLR. Dessutom har undantagsbeteendet ändrats vid försök att ange en MemoryStreamkapacitet eller längd utöver det här maxvärdet. I stället för att kasta en OutOfMemoryException, MemoryStream genererar nu en ArgumentOutOfRangeException för ogiltiga kapacitets- eller längdvärden.
Version lanserad
.NET 11 Förhandsversion 1
Tidigare beteende
MemoryStream Tidigare tilläts kapaciteter upp till int.MaxValue (0x7FFFFFFF), vilket kan resultera i ett OutOfMemoryException när du försöker allokera minne utöver CLR:s gräns på 0x7FFFFFC7.
När du ställer in kapaciteten eller längden på ett MemoryStream till ett värde som är större än den gräns som stöds utlöses en OutOfMemoryException .
var stream = new MemoryStream();
stream.SetLength(int.MaxValue); // Threw OutOfMemoryException.
Nytt beteende
Från och med .NET 11 inför MemoryStream en maximal kapacitet på 0x7FFFFFC7 bytes. Om du försöker ange kapacitet eller längd utöver den här gränsen kommer det att kasta ett ArgumentOutOfRangeException.
Undantagstypen för ogiltiga kapacitets- eller längdvärden har ändrats från OutOfMemoryException till ArgumentOutOfRangeException.
var stream = new MemoryStream();
stream.SetLength(int.MaxValue); // Throws ArgumentOutOfRangeException.
Typ av brytande ändring
Den här ändringen är en beteendeförändring.
Orsak till ändring
Den här ändringen introducerades för att justera beteendet MemoryStreammed CLR:s faktiska minnesallokeringsgränser. Det tidigare beteendet tillät utvecklare att ange kapaciteter eller längder som överskred den stödda gränsen, vilket ledde till körningsfel med mindre beskrivande undantag (OutOfMemoryException). Genom att begränsa den maximala kapaciteten och kasta ArgumentOutOfRangeExceptionförbättrar ändringen körningstillförlitligheten och ger tydligare feedback till utvecklare.
Rekommenderad åtgärd
Granska all kod som anger kapacitet eller längd för en MemoryStream för att säkerställa att den inte överskrider den maximala kapacitet som stöds.
Om din kod fångade OutOfMemoryException när du arbetade med MemoryStream kapacitets- eller längdoperationer bör du uppdatera den till att även fånga ArgumentOutOfRangeException, eftersom båda undantagen fortfarande kan inträffa.
-
ArgumentOutOfRangeExceptionutlöses vid försök att ange en ogiltig kapacitet eller längd (överskrider maxgränsen). -
OutOfMemoryExceptionkan fortfarande utlöses om det inte finns tillräckligt med minne på datorn.
var stream = new MemoryStream();
try
{
stream.SetLength(someLength);
}
catch (ArgumentOutOfRangeException)
{
// Handle invalid capacity/length scenario.
}
catch (OutOfMemoryException)
{
// Handle out of memory scenario.
}
Du kan också lägga till en kontroll innan du anger kapacitet eller längd för att undvika undantaget:
bool TrySetLength(MemoryStream stream, long length)
{
if (length > Array.MaxLength)
{
return false;
}
stream.SetLength(length);
return true;
}