Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
sınıfı MemoryStream artık CLR tarafından desteklenen bayt dizisinin 0x7FFFFFC7 gerçek maksimum uzunluğu olan maksimum bayt kapasitesini zorunlu tutar. Ayrıca, bir MemoryStream'nin kapasitesini veya uzunluğunu bu üst sınırın ötesine ayarlamaya çalışıldığında özel durum davranışı değişti. Artık geçersiz kapasite veya uzunluk değerleri için bir OutOfMemoryException yerine bir ArgumentOutOfRangeException atılmaktadır.
Sürüm kullanıma sunulmuştur
.NET 11 Önizleme 1
Önceki davranış
Daha önce, MemoryStream0x7FFFFFC7'ya kadar olan kapasiteleri (int.MaxValue (0x7FFFFFFF)) izin veriyordu, bu da CLR'nin desteklediği sınır olan OutOfMemoryException'ün ötesinde bellek ayırmaya çalışılırken sonuçlanabilirdi.
MemoryStream'ın kapasitesini veya uzunluğunu desteklenen sınırdan büyük bir değere ayarlarken, bir OutOfMemoryException fırlatıldı.
var stream = new MemoryStream();
stream.SetLength(int.MaxValue); // Threw OutOfMemoryException.
Yeni davranış
.NET 11'den başlayarak, MemoryStream bayt için maksimum kapasite zorunlu kılar. Kapasiteyi veya uzunluğu bu sınırın ötesinde ayarlamaya çalışılması bir ArgumentOutOfRangeException oluşturur.
Geçersiz kapasite veya uzunluk değerleri için özel durum türü OutOfMemoryException'dan ArgumentOutOfRangeException'ye değişti.
var stream = new MemoryStream();
stream.SetLength(int.MaxValue); // Throws ArgumentOutOfRangeException.
Kesinti yaratan değişiklik türü
Bu değişiklik davranışsal bir değişikliktir.
Değişiklik nedeni
Bu değişiklik, MemoryStream'nin davranışını CLR'nin gerçek bellek ayırma sınırlarıyla uyumlu hale getirmek için getirilmiştir. Önceki davranış, geliştiricilerin desteklenen sınırı aşan kapasiteleri veya uzunlukları belirtmesine izin verdi ve bu da daha az açıklayıcı özel durumlarla (OutOfMemoryException ) çalışma zamanı hatalarına yol açıyordu. Maksimum kapasiteyi sınırlandırarak ve ArgumentOutOfRangeException atarak, değişiklik çalışma zamanı güvenilirliğini artırır ve geliştiricilere daha net geri bildirim sağlar.
Önerilen eylem
Desteklenen maksimum kapasiteyi aşmadığından emin olmak için bir'in MemoryStream kapasitesini veya uzunluğunu ayarlayan tüm kodları gözden geçirin.
Kodunuz kapasite veya uzunluk işlemleriyle çalışırken OutOfMemoryException yakalanıyorsa, her iki özel durum da yine oluşabildiği için kodunuzun MemoryStream ve ArgumentOutOfRangeException yakalayacağı şekilde güncelleştirmeniz gerekir.
-
ArgumentOutOfRangeExceptionüst sınırını aşan geçersiz bir kapasite veya uzunluk ayarlanmaya çalışıldığında meydana gelir. -
OutOfMemoryExceptionmakinede kullanılabilir bellek yetersizse yine de atılabilir.
var stream = new MemoryStream();
try
{
stream.SetLength(someLength);
}
catch (ArgumentOutOfRangeException)
{
// Handle invalid capacity/length scenario.
}
catch (OutOfMemoryException)
{
// Handle out of memory scenario.
}
Özel durumdan kaçınmak için kapasiteyi veya uzunluğu ayarlamadan önce bir denetim de ekleyebilirsiniz:
bool TrySetLength(MemoryStream stream, long length)
{
if (length > Array.MaxLength)
{
return false;
}
stream.SetLength(length);
return true;
}