Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Třída MemoryStream nyní vynucuje maximální kapacitu 0x7FFFFFC7 bajtů, což je skutečná maximální délka pole bajtů podporované clR. Kromě toho se chování výjimky změnilo, když se pokusíte nastavit kapacitu nebo délku MemoryStream nad rámec tohoto maxima. Místo vyvolání OutOfMemoryException, MemoryStream nyní vyvolá ArgumentOutOfRangeException pro neplatné hodnoty kapacity nebo délky.
Verze byla představena
.NET 11 Preview 1
Předchozí chování
MemoryStream, dříve umožňoval kapacity až do int.MaxValue (0x7FFFFFFF), což mohlo vést k OutOfMemoryException při pokusu o přidělení paměti nad rámec podporovaného limitu CLR 0x7FFFFFC7.
Při pokusu o nastavení kapacity nebo délky MemoryStream na hodnotu větší, než je podporovaný limit, byla vyvolána výjimka OutOfMemoryException.
var stream = new MemoryStream();
stream.SetLength(int.MaxValue); // Threw OutOfMemoryException.
Nové chování
Počínaje verzí .NET 11 MemoryStream vynucuje maximální kapacitu 0x7FFFFFC7 bajtů. Pokus o nastavení kapacity nebo délky nad rámec tohoto limitu vyvolá výjimku ArgumentOutOfRangeException.
Typ výjimky pro neplatné hodnoty kapacity nebo délky se změnil z OutOfMemoryException hodnoty na ArgumentOutOfRangeException.
var stream = new MemoryStream();
stream.SetLength(int.MaxValue); // Throws ArgumentOutOfRangeException.
Typ zásadní změny
Tato změna je změna chování.
Důvod změny
Tato změna byla zavedena tak, aby MemoryStream chování sladila se skutečnými limity přidělení paměti modulu CLR. Předchozí chování vývojářům umožnilo určit kapacity nebo délky, které překročily podporovaný limit, což vede k selháním za běhu s méně popisnými výjimkami (OutOfMemoryException). Omezení maximální kapacity a vyvolání ArgumentOutOfRangeException zlepšuje spolehlivost modulu runtime a poskytuje vývojářům jasnější zpětnou vazbu.
Doporučená akce
Zkontrolujte veškerý kód, který nastaví kapacitu nebo délku, MemoryStream a ujistěte se, že nepřekračuje maximální podporovanou kapacitu.
Pokud váš kód zachytával OutOfMemoryException při operacích kapacity nebo délky, měli byste ho aktualizovat, aby zachytával také ArgumentOutOfRangeException, protože k oběma výjimkám mohou stále nastat:
-
ArgumentOutOfRangeExceptionje vyvolán při pokusu o nastavení neplatné kapacity nebo délky (překročení maxima). -
OutOfMemoryExceptionmůže být stále vyvolán, pokud na počítači není k dispozici dostatek paměti.
var stream = new MemoryStream();
try
{
stream.SetLength(someLength);
}
catch (ArgumentOutOfRangeException)
{
// Handle invalid capacity/length scenario.
}
catch (OutOfMemoryException)
{
// Handle out of memory scenario.
}
Před nastavením kapacity nebo délky můžete také přidat kontrolu, abyste se vyhnuli výjimce:
bool TrySetLength(MemoryStream stream, long length)
{
if (length > Array.MaxLength)
{
return false;
}
stream.SetLength(length);
return true;
}