Wie man StringBuilder mit Bedacht benutzt
Ich bin etwas verwirrt über die Verwendung StringBuilder
Klasse, erste:
Einen
string
Objekt Verkettung-operation erzeugt immer ein neues Objekt aus den vorhandenenstring
und die neuen Daten. EinStringBuilder
- Objekt verwaltet einen Puffer, um Platz für die Verkettung von neuen Daten. Neue Daten werden angehängt an das Ende des Puffers, wenn Raum vorhanden ist; andernfalls wird eine neue, größere Puffer zugeordnet ist, Daten aus der ursprünglichen Puffer kopiert, der neue Puffer, dann werden die neuen Daten angehängt, um die neuen Puffer.
Aber wo ist der Sinn der Schaffung StringBuilder
Instanz zu vermeiden, erstellen eine neue String
? Es klingt wie der Handel "one for one".
static void Main(string[] args)
{
String foo = "123";
using (StringBuilder sb = new StringBuilder(foo)) //also sb isn't disposable, so there will be error
{
sb.Append("456");
foo = sb.ToString();
}
Console.WriteLine(foo);
Console.ReadKey();
}
Warum sollte ich nicht einfach
+=
Edit: Ok, ich weiß jetzt, wie man wiederverwenden, eine Instanz von StringBuilder
(weiß noch nicht, ob das richtig ist mit code-standards), aber das ist es nicht Wert zu verwenden, mit nur einem string
, ist es nicht?
InformationsquelleAutor der Frage Bartłomiej Sobieszek | 2014-02-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ändern unveränderlich Strukturen wie
string
s muss getan werden, um das kopieren der Struktur, und von dieser, verbraucht mehr Speicher und eine Verlangsamung der Anwendung führen Sie die Zeit (auch die zunehmendeGC
Zeit, etc...).StringBuilder
kommt, um zu lösen dieses problem durch die Verwendung der gleichen veränderlichen Objekt für Manipulationen.Jedoch:
bei der Verkettung eine
string
im compile-Zeit, wie die folgenden:wird es tatsächlich kompilieren zu so etwas wie:
diese Funktion ist schneller als die Arbeit mit
StringBuilder
für die Anzahl derstring
s Eingabe der Funktion bekannt ist.also zur compile-Zeit bekannt
string
Verkettungen sollten Sie lieberstring.Concat()
.als für unbekannte Anzahl von
string
wie im folgenden Fall:Nun kann der compiler nicht die
string.Concat()
Funktion, jedochStringBuilder
scheint effizienter zu sein in der Zeit-und Speicher-Verbrauch nur, wenn die Verkettung erfolgt mit 6-7 oder mehrstrings
.Schlechte Praxis Verwendung:
Feine Praxis-Nutzung (beachten Sie, dass
if
verwendet wird):Best-practice-Nutzung (beachten Sie, dass
while
- Schleife verwendet wird):InformationsquelleAutor der Antwort Tamir Vered
Einen
string
ist ein unveränderlich Klasse. Können Sie es nicht ändern, nur neue erstellenstrings
.So, wenn Sie schreiben
result += a;
haben Sie drei separatestrings
im Speicher an diesem Punkt:a
, wird der alte Wertresult
und den neuen Wert. Dies ist natürlich absolut in Ordnung, wenn Sie nur verketten eine begrenzte Anzahl vonstrings
. Wenn Sie das nicht in einemfor
Schleife iteriert über eine große Sammlung, kann es zum problem.Den
StringBuilder
- Klasse bietet eine verbesserte Leistung in diesen Fällen. Anstatt neuestrings
zu speichern, das Ergebnis der Verkettung verwendet es das gleiche Objekt. Also, wenn SiestringBuilder.Append(a);
man nie das äquivalent der "alte Wertresult
".Dieser Speicher Effizienz kommt mit einem Preis, natürlich. Wenn nur die Verkettung einer kleinen Anzahl von
strings
eineStringBuilder
ist oft weniger efficienct im Hinblick auf Geschwindigkeit, da es mehr overhead im Vergleich zu den unveränderlichenstring
Klasse.Eine Sache im Auge zu behalten ist, dass, wenn Sie müssen die fortgeschrittene Streicher
StringBuilder
können, werden weniger effizient, da ruft.ToString()
erstellt eine neue Kopie derstring
.InformationsquelleAutor der Antwort Dirk
Der Grund ist, weil
strings
sind unveränderlich. Bei der Verkettung einestring
erstellen Sie eine neuestring
. Also, wenn Sie brauchen, um zu verketten vielestrings
erstellen Sie eine Menge vonobjects
. Diese kostet nicht viel in Bezug auf Speicher, da jederstring
ist einmal verwendet. Aber es gibt zusätzliche Arbeit für dieGC
.StringBuilder
jedoch verwendet die gleichenobject
jedes mal, aber es tut dies auf Kosten der Benutzerfreundlichkeit.InformationsquelleAutor der Antwort Aron