2015-09-07 14 views
5

Dizeleri StringBuilder'a eklerken, Kapasitesi ve Uzunluğu MaxCapacity'un ötesine geçebilir mi?StringBuilder: StringBuilder'ın uzunluğu ve kapasitesi MaxCapacity değerini aşar

MSDN'e göre MaxCapacity "String oluşturucu örneğinin tutabileceği maksimum karakter sayısı" olarak tanımlanır. Ama bu davranış iki kod snippet'ine aşağıda tutarsız:

Parçacığı 1: StringBuilder uzunluğu onun MaxCapacity aştığında aşağıdaki kodu ArgumentOutOfRangeException yılında atılır - beklendiği gibi olmasıdır.

 String str = sb.ToString(); 

     StringBuilder sb1 = new StringBuilder(3, 5); 
     sb1.Append("1");  //no error as Length 1 <= max limit 5   
     sb1.Append("12");  //no error as Length 3 <= max limit 5   
     sb1.Append("123"); //ArgumentOutOfRangeException Thrown as Length 6 > max limit 5 

SNIPPET 2: StringBuilder uzunluğu, MaxCapacity aştığında, aşağıdaki kod no ArgumentOutOfRangeException olarak atılır - Bu davranış, hatalı olduğu görülmektedir. Bu iki durumda da oluyor ve neden davranış farkıdır neyin

 StringBuilder sb = new StringBuilder(3, 5); 

     sb.Append("1"); //no error as Length 1 <= max limit 5   
     sb.Append("2"); //no error as Length 2 <= max limit 5   
     sb.Append("3"); //no error as Length 3 <= max limit 5   
     sb.Append("4"); //no error as Length 4 <= max limit 5   
     sb.Append("5"); //no error as Length 5 <= max limit 5   
     sb.Append("6"); //Even though Length 6 > max limit 5 NO EXCEPTION IS THROWN   

     String str = sb.ToString(); //Contains "123456" 

Herkes lütfen açıklayabilir? Arayanlara

+0

bu bağlantıyı kontrol edin: https://msdn.microsoft.com/en-us/library/system.text.stringbuilder.maxcapacity (v = vs.110) .aspx –

+0

StringBuilder kapasitesi 0 değil 1'den başlıyor. 0 + "1" + "12" + "123" = 6 – Gregg

+0

İlginç. Eğer StringBuilder sb = yeni StringBuilder (0, 5); 'ı denerseniz, ikinci örnek atar. –

cevap

7

StringBuilder Constructor (Int32, Int32)

Notlar .NET Framework 4 ve .NET Framework 4.5 olarak
, sen StringBuilder (Int32, Int32) arayarak StringBuilder nesne örneğini zaman StringBuilder örneğinin hem uzunluğu hem de kapasitesi olan kurucu, MaxCapacity özelliğinin değerini aşabilir. Bu, özellikle küçük dizeler eklemek için Append ve AppendFormat yöntemlerini çağırdığınızda ortaya çıkabilir.

Ek Kaynak: performans nedenleriyle gibi

Bu sınıf yazmış bu şekilde: Sen StringBuildersource code

Sonuç bakmak olabilir

  • Resmi belgelerde belirtilen, Capacity ve Length özellikle küçük dizeler eklerken MaxCapacity'un ötesine geçebilir.

    • Eğer uygulamanızı bekliyoruz: belgelerde belirtildiği Dahası olarak varsayılan değerlerinden bazılarını implementation-specific ve böylece daha iyi sen Capacity ve MaxCapacity güvenmek ve sadece performans için bu sınıfı kullanmayan görünüyor bu koşulları nedenlerinden dolayı Tasarım zamanında bir dizede bilinmeyen sayıda değişiklik yapın (örneğin, kullanıcı girdisini içeren rasgele bir dizi diziyi birleştirmek için bir döngü kullandığınızda).
    • Uygulamanızın bir dizede önemli sayıda değişiklik yapmasını beklediğinizde.
+0

Oldukça kötü ... – Rawling

+0

Bunun pratikte ne anlama geldiğini tahmin ediyorum, "Uzunluk", "MaxCapacity" den daha az olduğu sürece bir StringBuilder'e ekleyebiliyorsunuz. Muhtemelen, 4. versiyonda yapılan bir değişiklik olduğu göz önüne alındığında, bunun için iyi bir neden vardı. – jmcilhinney

+0

@HenkHolterman Kapasite üzerinde maksimum değer mi? – Rawling

İlgili konular