Aracılığıyla paylaş


MemoryStream kapasite üst sınırı güncelleştirildi ve özel durum davranışı değiştirildi

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.

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.
  • OutOfMemoryException makinede 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;
}

Etkilenen API'ler