2010-06-18 33 views
5

Viele Fragen wurden bereits zu den Unterschieden zwischen String und String Builder gestellt und die meisten Leute behaupten, dass String Builder schneller als String ist. Ich bin neugierig zu wissen, ob String Builder zu gut ist, also warum String ist da? Darüber hinaus kann mir irgendein Körper ein Beispiel geben, in dem die Saite nützlicher ist als der Saitenbauer?Wo sind Strings nützlicher als ein StringBuilder?

+2

Siehe http://www.yoda.arachsys.com/csharp/stringbuilder.html –

+1

http://www.joelonsoftware.com/articles/fog0000000319.html Joel On Software hat eine schöne Erklärung dessen, was tatsächlich passiert, wenn Sie Verketten Sie zwei Strings. Der Artikel handelt von C++, aber C# funktioniert genauso. Ignoriere alles in und unter dem "Wie repariere ich das?" Abschnitt, da dieser Teil C++ - spezifisch ist; In C# behebt man es mit 'StringBuilder', was ähnlich funktioniert wie im Abschnitt" Wie repariere ich das? ". – Brian

+0

möglich duplicate von [String vs. StringBuilder] (http://stackoverflow.com/questions/73883/string-vs-stringbuilder) – nawfal

Antwort

3

Es ist kein Fall von denen mehr ist nützlich ...

Ein String ist ein String - ein oder mehrere Zeichen nebeneinander. Wenn Sie ändern wollen eine Zeichenfolge in someway, wird es einfach mehr Strings erstellt werden, weil sie immutable sind.

Eine StringBuilder ist eine Klasse, die Strings erstellt. Es bietet eine Möglichkeit, sie zu konstruieren, ohne viele redundante Strings im Speicher zu erzeugen. Das Endergebnis wird immer ein String sein.

Tu das nicht

string s = "my string"; 
s += " is now a little longer"; 

oder

s = s + " is now longer again"; 

Die Strings im Speicher (in Wirklichkeit, siehe unten) schaffen würde.

tun:

StringBuilder sb = new StringBuilder(); 
sb.Append("my string"); 
sb.Append(" is now a little longer"); 
sb.Append(" is now longer again"); 
string s = sb.ToString(); 

Die Zeichenfolge im Speicher schaffen würde (wieder, siehe unten).

Sie können dies tun:

string s = "It is now " + DateTime.Now + "."; 

Das schafft nur Zeichenfolge im Speicher.

Als eine Randnotiz, nimmt die Erstellung einer StringBuilder sowieso eine gewisse Menge an Speicher.Als grobe Faustregel gilt:

  • Verwenden Sie immer eine StringBuilder, wenn Sie Strings in einer Schleife verketten.
  • Verwenden Sie eine StringBuilder, wenn Sie eine Zeichenfolge mehr als 4 Mal verketten.
+1

string.Concat ist auch eine praktikable Lösung für Ihre Beispiel. 'string s = string.Concat (" meine Zeichenfolge "," ist jetzt ein wenig länger "," ist jetzt wieder länger ");' –

+0

Guter Punkt. Ich denke, das ist Geschmackssache. –

1

Würden Sie wirklich einen String Builder verwenden?

Console.WriteLine("MyString"); 

Stringbuilder ist groß, wenn Sie große Mengen an Verkettung tun müssen, um eine Zeichenfolge zu bauen.

Jon Skeet hat eine große Aricle auf diese hier: http://www.yoda.arachsys.com/csharp/stringbuilder.html

Überprüfen Sie den Abschnitt aus, die beginnt „Also ich String überall verwenden sollten, nicht wahr?“

Er schreibt:

Der wesentliche Unterschied zwischen diesem Beispiel und der vorherige ist, dass wir einfach alle Fäden präsentieren , die miteinander verkettet werden müssen in einem Aufruf zu String.Concat. Das bedeutet, dass keine Zwischenzeichenfolgen benötigt werden. Stringbuilder ist effizient in dem ersten Beispiel, weil es als Behälter für das Zwischenergebnis wirkt ohne dass Ergebnis jedes Mal kopieren zu müssen - wenn es überhaupt kein Zwischenergebnis ist, hat es keinen Vorteil.


+0

danke brendan..der link ist wirklich gut – DJay

2

Stringbuilder ist besser, wenn Sie den Wert ändern. Sonst ist es nicht nötig.

Wenn ich denselben String-Wert an 10 Stellen verwenden soll, verwende ich String. Wenn ich es 10 mal ändern muss, StringBuilder.

7

StringBuilder ist eine bessere Option beim Konstruieren und Ändern von Strings durch starke Schleifen oder Iterationen.

Einfache Zeichenfolgenoperationen wie einige Verkettungen oder einfach das Speichern eines Zeichenfolgenwerts passen besser zu einem Standardzeichenfolgenobjekt.

Ähnliche Fragen? String vs. StringBuilder

0

StringBuilder ist nicht schneller als die Verwendung eines Strings bis zum Erstellen einer Zeichenfolge.

StringBuilder kann schneller sein, wenn Sie mehrere Strings miteinander verketten müssen (wie in einer Schleife). Sie müssen eine Leistungseinbuße zahlen, wenn Sie den Inhalt des String-Builders in eine Zeichenfolge konvertieren müssen.

Einer der echten Vorteile von StringBuilder gegenüber String ist, dass Sie es über mehrere Methoden übergeben und Strings anhängen können. Sie können das nicht tun, indem Sie ein String-Objekt übergeben. Wenn Sie also eine rekursive Operation ausführen, bei der Sie ein JSON-Objekt oder ähnliches erstellen, können Sie den StringBuilder übergeben und die Werte anhängen.

11

StringBuilder ist, wie der Name schon sagt, verwendet bauen Strings, während Zeichenfolgen sind unveränderliche Zeichen-Werte. Verwenden Sie Zeichenfolgen, wenn Sie Zeichendaten weitergeben möchten, und verwenden Sie StringBuilder, wenn Sie Zeichendaten bearbeiten möchten.

0

Eine Zeichenfolge ist gut, weil sie unveränderlich ist. Und das Unveränderliche ist gut, ist etwas, was funktionale Sprachen beweisen.

Wenn Sie eine (Referenz auf) Zeichenfolge "Dies ist eine Zeichenfolge" haben, können Sie sicher sein, dass sie für immer denselben Wert hat. Während der Wert eines StringBuilders möglicherweise geändert wird (durch einen Methodenaufruf, einen anderen Thread usw.).

Aber manchmal benötigen Sie rohe, reine Geschwindigkeits- und Speichernutzungsoptimierungen. In diesem Fall verwenden Sie einen Stringbuilder.

Ein Beispiel:

var a = "This is a string"; 
var b = a; 
a += ". And some part is added"; // a now references another string in memory 

var aSB = new StringBuilder("This is a string"); 
var bSB = aSB 
aSB.Append(". And some part is added"); // aSB and bSB still reference the same memory spot 

Console.WriteLine(b); // ==> This is a string 
Console.WriteLine(bSB); // ==> This is a string. And some part is added 
0

Eine Analyse, die zu verwenden ist, wird zur Verfügung gestellt: Concatenating Strings Efficiently.

Im Wesentlichen, (obwohl lesen Sie den Link für die vollständige Analyse), verwenden Sie StringBuilder beim Verketten in einer nicht-trivialen Schleife.