2012-08-02 14 views
5

Ich lese ein Buch namens .NET Gotchas (lohnt sich ein Lesen IMO), die die Leistungsunterschiede zwischen String und StringBuilder veranschaulicht, und es ergab sich eine Frage, die ich Filz konnte nicht unbeantwortet bleiben! Obwohl ich die Interna beider Klassen nicht kenne (ohne die reflektierten Versionen dieser Klassen zu betrachten), habe ich mich gewundert; Da die Operatoren in .NET überladbar sind, hat Microsoft die String-Klasse nicht implementiert, um StringBuilder intern zu verwenden und die Verkettungsoperatoren zu überladen, um .Append() in StringBuilder einfach aufzurufen. Ich vermute, es gibt einige Gründe, warum dies nicht der Fall ist, und wenn ja, warum?.NET String Verkettung (+ & + =) vs. StringBuilder

Antwort

6

Das Problem ist nicht so sehr, dass String-Verkettung ist langsam, es ist mehr, dass wiederholte Verkettung erstellt eine Menge von Zwischen-Strings, die zugeordnet werden müssen und später Müll gesammelt.

EDIT
Beachten Sie, dass mystring += "a" nicht einfach add "a" zum vorherigen String. Er erstellt eine neue Zeichenfolge für die Kombination und verweist darauf "mystring", wodurch der vorherige Wert verworfen wird (wenn keine Referenzen mehr vorhanden sind).

END EDIT

Eine Reihe von

string mystring = "something"; 
mystring += "something else"; 
mystring = mystring + "third"; 

langsamer ausführen, wenn Sie jede einzelne Zeile als String Anfügen von einem .ToString gefolgt tun() das Ergebnis zurück in einen String zu erhalten. Sie erhalten nur dann einen Leistungsvorteil, wenn Sie einen einzelnen StringBuilder, Append() mehrmals verwenden und am Ende einen .ToString() ausführen.

StringBuilder sb = new StringBuilder(); 
sb.Append("something"); 
sb.Append("something else"); 
sb.Append("third"); 
string mystring = sb.ToString(); 

Und dann ein Stringbuilder hat einen eigenen Aufwand ist so, dass es Sie nicht davon profitieren, wenn Sie eine kleine Anzahl von String-Teile zu verbinden.

Beachten Sie, dass der Compiler eine Verkettung in einer einzigen Anweisung optimiert weg:

string mystring = "something" + "something else" + "third"; 

ist am schnellsten.

5

Der Grund ist einfach:

weil

string result = a + b; 

effizienter als

ist
var sb = new StringBuilder(a, a.Length + b.Length); 
sb.Append(b); 
string result = sb.ToString(); 

StringBuilder s nur dann Sinn machen, wenn viele Verkettungen passiert sind, in der Regel innerhalb einer Schleife.