2009-02-09 17 views
13

Mögliche Duplizieren:
String vs StringBuilderWann sollte StringBuilder verwendet werden?

ich nur einige der Bücher neu aufgelegt, die ich VB.NET abholen verwendet. Ich bin mir nicht sicher, ob ich das in meinem Kopf habe, verstehe, wie/was StringBuilder ist.

Was ist die Anleitung für die Verwendung? Ist es am besten, es zu verwenden, wenn Sie 2 Strings oder 50 verketten?

Oder wenn die Gesamtlänge der Zeichenfolge größer als 128 Zeichen ist?

Oder sehen Sie einen Leistungsvorteil, wenn Sie ihn zum Hinzufügen von Strings verwenden?

In diesem Fall ist es besser, eine StringBuilder-Instanz zu verwenden, um eine SQL-Anweisung als string.format("Select * from x where y = {0}",1) zu erstellen?

Es ist mir immer aufgefallen, dass das Deklarieren einer anderen Variablen und das Einschließen eines Namensraums für kleine String-Verkettungen nicht vorteilhaft ist, aber ich bin mir jetzt nicht sicher.

Entschuldigung, viele Dokumentationen sagen Ihnen, was Sie verwenden sollen, nur nicht das Beste.

+0

Versuchen Sie diese Frage: [http://stackoverflow.com/questions/73883/string-vs-stringbuilder](http://stackoverflow.com/questions/73883/string-vs-stringbuilder) –

Antwort

32

Ich habe eine article on this very topic. Zusammengefasst (vom unteren Rand der Seite kopiert):

  • Definitiv Stringbuilder verwenden, wenn Sie in einer nicht-trivialen Schleife sind verketten - vor allem, wenn Sie nicht sicher wissen (zum Zeitpunkt der Kompilierung), wie viele Iterationen Sie werden durch die Schleife machen. Wenn Sie zum Beispiel eine Datei zu einem bestimmten Zeitpunkt lesen und dabei eine Zeichenkette mit dem Operator + = erstellen, ist dies möglicherweise ein Leistungsselbstmord.
  • Verwenden Sie den Verkettungsoperator, wenn Sie (lesbar) alles angeben können, was in einer Anweisung verkettet werden muss. (Wenn Sie ein Array von Verkettungen haben, sollten Sie String.Concat explizit aufrufen - oder String.Join, wenn Sie ein Delimiter benötigen.)
  • Haben Sie keine Angst, Literale in mehrere verkettete Bits zu zerlegen - das Ergebnis wird sein das Gleiche. Sie können die Lesbarkeit verbessern, indem Sie beispielsweise ein langes Literal in mehrere Zeilen aufteilen, ohne die Leistung zu beeinträchtigen.
  • Wenn Sie die Zwischenergebnisse der Verkettung für etwas anderes als die nächste Iteration der Verkettung benötigen, wird StringBuilder Ihnen nicht helfen. Wenn Sie zum Beispiel einen vollständigen Namen aus einem Vornamen und einem Nachnamen erstellen und dann am Ende eine dritte Information (den Spitznamen, vielleicht) hinzufügen, profitieren Sie nur dann von StringBuilder, wenn Sie dies nicht tun brauche die Zeichenfolge (Vorname + Nachname) für andere Zwecke (wie im Beispiel, das ein Person-Objekt erstellt).
  • Wenn Sie nur ein paar Verkettungen zu tun haben, und Sie wollen sie wirklich in separaten Anweisungen tun, ist es nicht wirklich wichtig, in welche Richtung Sie gehen. Welcher Weg effizienter ist, hängt von der Anzahl der Verkettungen, der Größe der beteiligten Zeichenketten und der Reihenfolge ab, in der sie verkettet sind. Wenn Sie wirklich glauben, dass dieser Codeabschnitt ein Leistungsengpass ist, profilieren Sie ihn in beide Richtungen.
+1

Neugierig, haben Sie jemals einen StringBuilder vs. String.Concat (theStrings.ToArray()) profiliert? String.Concat ist eigentlich eine ziemlich effektive Methode. – JaredPar

+0

Wenn Sie bereits alle Zeichenfolgen haben, die Sie in einem Array benötigen, dann würde ich erwarten, dass String.Concat wirklich sehr schnell ist - es kann (perfekt) die Größe berechnen, die benötigt wird, um damit zu beginnen. Es ist bedauerlich, dass Sie die Liste in ein Array konvertieren müssen, um damit zu beginnen. Ein String.Concat (IList ) wäre nett. –

+0

Oh, und in anderen Nachrichten: Ausschneiden und Einfügen für den Sieg;) –

12

Hier ist meine Daumenregel:

StringBuilder am besten verwendet, wenn die genaue Anzahl der Verkettungen unbekannt bei der Kompilierung ist.

+0

Ok, so dass würde bedeuten, dass 99% der Datenbankanwendungen keinen stringbuilder verwenden würden, um die SQL-Anweisung zu erstellen, aber manchmal nicht sicher, wie viele "wo" Sie bis zum Ende verketten werden, wird immer 1 ... sein, sollte aber nicht sein mehr als 3, würdest du immer noch stringbuilder dafür verwenden? – spacemonkeys

+0

Es ist eine gute Faustregel, aber gelegentlich, wenn Sie eine sehr große Zeichenfolge erstellen, aber keine Schleifen verwenden, wäre ein StringBuilder besser. –

+0

@BC - guter Punkt - Faustregeln haben immer Ausnahmen :) –

0

Persönlich benutze ich StringBuilder, wenn ich mehr als nur ein oder zwei Strings verketten muss. Ich bin mir nicht sicher, ob es einen wirklichen Performance-Hit gibt, aber ich habe immer gelesen und gehört, dass eine regelmäßige Verkettung mit mehreren Strings jedes Mal eine zusätzliche Kopie der Zeichenkette erzeugt, während StringBuilder eine Zeichenkette behält kopieren, bis Sie die endgültige ToString() Methode darauf aufrufen.

0

Jemand hat experimentell herausgefunden, dass die kritische Zahl 6 ist. Mehr als 6 Verkettungen hintereinander und Sie sollten einen StringBuilder verwenden. Kann mich nicht erinnern, wo ich das gefunden habe.

Beachten Sie jedoch, dass, wenn Sie nur das in einer Zeile schreiben:

"qwert" + "yuiop" + "asdf" + "gh" + "jkl;" + "zxcv" + "bnm" + ",." 

, die in einem Funktionsaufruf umgewandelt wird (ich weiß nicht, wie es in VB.net zu schreiben)

String.Concat("qwert", "yuiop", "asdf", "gh", "jkl;", "zxcv", "bnm", ",."); 

Also, wenn Sie alle Verkettungen in einer Zeile tun, dann kümmern Sie sich nicht mit StringBuilder, da String.Concat effektiv alle Verkettungen in einem Rutsch erledigt. Es ist nur, wenn Sie sie in einer Schleife oder hintereinander verketten.

0

Meine Regel: Wenn Sie einer Zeichenfolge in einer For- oder Foreach-Schleife eine Zeichenfolge hinzufügen, verwenden Sie den StringBuilder.

Verwandte Themen