2015-09-07 8 views
5

Beim Anhängen von Strings an eine StringBuilder, können seine Kapazität und Länge über seine MaxCapacity hinaus gehen?StringBuilder: Können StringBuilders Länge und Kapazität die MaxCapacity überschreiten?

Laut MSDN ist MaxCapacity definiert als "Die maximale Anzahl von Zeichen, die String Builder-Instanz enthalten kann". Aber dieses Verhalten ist in folgenden zwei Code-Snippets inkonsistent:

1 Snippet: Im folgenden Code ArgumentOutOfRangeException ausgelöst wird, wenn die Länge des String seine MaxCapacity überschreitet - Dies ist wie erwartet.

 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: Im folgenden Code NO ArgumentOutOfRangeException ausgelöst wird, wenn die Länge des String seine MaxCapacity überschreitet - Dieses Verhalten falsch zu sein scheint.

 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" 

Kann jemand bitte erklären, was in diesen beiden Fällen geschieht und warum ist der Unterschied im Verhalten?

+0

überprüfen Sie diesen Link: https://msdn.microsoft.com/de-us/library/system.text.stringbuilder.maxcapacity (v = vs.110) .aspx –

+0

Die StringBuilder-Kapazität beginnt bei 0 nicht 1. 0 + "1" + "12" + "123" = 6 – Gregg

+0

Interessant. Wenn Sie 'StringBuilder sb = new StringBuilder (0, 5);' versuchen, wird das zweite Beispiel ausgelöst. –

Antwort

7

StringBuilder Constructor (Int32, Int32)

Hinweise zu Aufrufern
In .NET Framework 4 und dem .NET Framework 4.5, wenn Sie die Stringbuilder-Objekt instanziiert durch den Aufruf der String (Int32, Int32) Konstruktor, sowohl die Länge und die Kapazität der StringBuilder-Instanz kann über den Wert von seine MaxCapacity-Eigenschaft wachsen. Dies kann insbesondere auftreten, wenn Sie die Methoden Append und AppendFormat aufrufen, um kleine Strings anzuhängen, wenn Sie aufrufen.

Zusätzliche Quellen:

  • Sie einen Blick darauf werfen können StringBuildersource code

Fazit:

Diese Klasse diese Weise aus Performance-Gründen geschrieben hat und als in offiziellen Dokumenten angegeben, seine Capacity und Length können über die MaxCapacity insbesondere beim Anhängen kleiner Strings hinauswachsen. Des Weiteren, wie in den Dokumenten angegeben, sind einige der Standardwerte implementation-specific und so scheint es Sie besser nicht auf Capacity und MaxCapacity verlassen Sie sich, und nur bei Verwendung dieser Klasse aus Leistungsgründen diese Bedingungen:

  • Wenn Sie erwarten, dass Ihre App eine unbekannte Anzahl von Änderungen an einer Zeichenfolge zur Entwurfszeit vornehmen (z. B. wenn Sie eine Schleife verwenden, um eine zufällige Anzahl von Zeichenfolgen zu verketten, die Benutzereingaben enthalten).
  • Wenn Sie erwarten, dass Ihre App eine erhebliche Anzahl von Änderungen an einer Zeichenfolge vornimmt.
+0

Das ist ziemlich schlecht ... – Rawling

+0

Ich vermute, dass das in der Praxis bedeutet, dass Sie an einen 'StringBuilder' anhängen können, solange die aktuelle' Length' kleiner als die 'MaxCapacity' ist. Es gab vermutlich einen guten Grund dafür, da es sich um eine Änderung in der Version 4 handelte. – jmcilhinney

+0

@HenkHolterman Setzen Sie ein Maximum für die Kapazität? – Rawling

Verwandte Themen