Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Kelas MemoryStream sekarang memberlakukan kapasitas maksimum 0x7FFFFFC7 byte, yang merupakan panjang maksimum sebenarnya dari array byte yang didukung oleh CLR. Selain itu, perilaku pengecualian telah berubah ketika berusaha mengatur kapasitas atau panjang MemoryStream melebihi maksimum ini. Alih-alih melemparkan OutOfMemoryException, MemoryStream sekarang melemparkan ArgumentOutOfRangeException untuk nilai kapasitas atau panjang yang tidak valid.
Versi yang diperkenalkan
.NET 11 Pratinjau 1
Perilaku sebelumnya
Sebelumnya, MemoryStream memungkinkan kapasitas hingga int.MaxValue (0x7FFFFFFF), yang dapat mengakibatkan OutOfMemoryException ketika mencoba mengalokasikan memori melampaui batas yang didukung CLR dari 0x7FFFFFC7.
Saat mengatur kapasitas atau panjang MemoryStream ke nilai yang lebih besar dari batas yang didukung, sebuah OutOfMemoryException dilemparkan.
var stream = new MemoryStream();
stream.SetLength(int.MaxValue); // Threw OutOfMemoryException.
Perilaku baru
Mulai dari .NET 11, MemoryStream menerapkan kapasitas maksimum 0x7FFFFFC7 byte. Mencoba mengatur kapasitas atau panjang di luar batas ini akan menghasilkan ArgumentOutOfRangeException.
Jenis pengecualian untuk nilai kapasitas atau panjang yang tidak valid telah berubah dari OutOfMemoryException ke ArgumentOutOfRangeException.
var stream = new MemoryStream();
stream.SetLength(int.MaxValue); // Throws ArgumentOutOfRangeException.
Jenis perubahan yang memutus kompatibilitas
Perubahan ini adalah perubahan perilaku.
Alasan perubahan
Perubahan ini diperkenalkan untuk menyelaraskan perilaku MemoryStream dengan batas alokasi memori CLR yang sebenarnya. Perilaku sebelumnya memungkinkan pengembang menentukan kapasitas atau panjang yang melebihi batas yang didukung, yang menyebabkan kegagalan runtime dengan pengecualian yang kurang deskriptif (OutOfMemoryException). Dengan membatasi kapasitas maksimum dan melakukan ArgumentOutOfRangeException, perubahan ini meningkatkan keandalan runtime dan memberikan umpan balik yang lebih jelas kepada pengembang.
Tindakan yang direkomendasikan
Tinjau kode apa pun yang mengatur kapasitas atau panjang untuk MemoryStream memastikannya tidak melebihi kapasitas maksimum yang didukung.
Jika kode Anda menangani OutOfMemoryException saat bekerja dengan operasi kapasitas atau panjang MemoryStream, Anda harus memperbaruinya untuk juga menangani ArgumentOutOfRangeException, karena kedua pengecualian tersebut masih dapat terjadi.
-
ArgumentOutOfRangeExceptiondilemparkan saat mencoba mengatur kapasitas atau panjang yang tidak valid (melebihi maksimum). -
OutOfMemoryExceptionmasih dapat dilemparkan jika tidak ada cukup memori yang tersedia pada mesin.
var stream = new MemoryStream();
try
{
stream.SetLength(someLength);
}
catch (ArgumentOutOfRangeException)
{
// Handle invalid capacity/length scenario.
}
catch (OutOfMemoryException)
{
// Handle out of memory scenario.
}
Anda juga dapat menambahkan pemeriksaan sebelum mengatur kapasitas atau panjang untuk menghindari pengecualian:
bool TrySetLength(MemoryStream stream, long length)
{
if (length > Array.MaxLength)
{
return false;
}
stream.SetLength(length);
return true;
}