2010-06-18 18 views
5

Sono già state poste molte domande sulle differenze tra string e string builder e la maggior parte delle persone suggerisce che il generatore di stringhe sia più veloce della stringa. Sono curioso di sapere se il generatore di stringhe è troppo buono, quindi perché la stringa è lì? Inoltre, qualche corpo può darmi un esempio in cui la stringa sarà più utile del generatore di stringhe?Dove sono le stringhe più utili di un StringBuilder?

+2

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

+1

http://www.joelonsoftware.com/articles/fog0000000319.html Joel On Software ha una buona spiegazione di ciò che accade effettivamente quando si concatenare due stringhe. L'articolo riguarda C++, ma C# funziona allo stesso modo. Ignora tutto in e sotto "Come posso risolvere questo problema?" sezione, poiché quella parte è specifica per C++; in C#, lo aggiusti usando 'StringBuilder', che funziona in modo simile a quanto riportato nella sezione" come posso risolvere questo problema ". – Brian

+0

possibile duplicato di [String vs. StringBuilder] (http://stackoverflow.com/questions/73883/string-vs-stringbuilder) – nawfal

risposta

3

Non è un caso di cui è più utile ...

A String è un String - uno o più caratteri uno accanto all'altro. Se si vuole cambiamento una stringa in qualche modo, sarà sufficiente creare più stringhe perché sono immutable.

A StringBuilder è una classe che crea stringhe. Fornisce un mezzo per costruirli senza creare molte stringhe ridondanti in memoria. Il risultato finale sarà sempre un String.

Non fare questo

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

o

s = s + " is now longer again"; 

che creerebbe stringhe in memoria (in realtà, vedi sotto).

fare questo:

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(); 

che creerebbe stringa in memoria (ancora una volta, vedi sotto).

Si può fare questo:

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

Questo crea solo stringa in memoria.

Come nota a margine, la creazione di un StringBuilder richiede comunque una certa quantità di memoria.Come regola approssimativa:

  • Utilizzare sempre un StringBuilder se si concatenano stringhe in un ciclo.
  • Utilizzare un StringBuilder se si concatena una stringa più di 4 volte.
+1

string.Concat è anche una soluzione praticabile per il tuo esempio. 'string s = string.Concat (" la mia stringa "," ora è un po 'più lunga "," ora è di nuovo più lunga ");' –

+0

Buon punto. Immagino sia una questione di gusti. –

1

Utilizzeresti davvero un generatore di stringhe qui?

Console.WriteLine("MyString"); 

StringBuilder è ottimo quando è necessario eseguire grandi quantità di concatenazione per creare una stringa.

Jon Skeet ha un grande aricle su questo qui: http://www.yoda.arachsys.com/csharp/stringbuilder.html

controllare la sezione che inizia "Allora dovrei usare StringBuilder Ovunque, vero?"

Egli scrive:

La differenza fondamentale tra questo esempio e quello precedente è che possiamo presentare facilmente tutte le corde che devono essere concatenati insieme in una chiamata a String.Concat. Che significa che nessuna stringa intermedia è necessaria. StringBuilder è efficiente nel primo esempio perché agisce come un contenitore per il risultato intermedio senza dover copiare tale risultato ogni volta - quando non c'è risultato intermedio comunque, non ha vantaggio.


+0

grazie brendan..il link è veramente buono – DJay

2

StringBuilder è migliore quando è necessario modificare il valore. Altrimenti, non ce n'è bisogno.

Se ho bisogno di utilizzare lo stesso valore di stringa in 10 punti, come lo sono, userò String. Se ho bisogno di cambiarlo 10 volte, StringBuilder.

7

StringBuilder è un'opzione migliore quando si costruiscono e si modificano stringhe tramite looping o iterazioni pesanti.

Le semplici operazioni di stringa come alcune concatenazioni o semplicemente la memorizzazione di un valore di stringa si adattano molto meglio a un oggetto stringa standard.

Domanda simile? String vs. StringBuilder

0

StringBuilder non è più veloce dell'utilizzo di una stringa fino alla semplice creazione di una stringa.

StringBuilder può essere più veloce quando si devono concatenare più stringhe insieme (come nel ciclo). Stai pagando una penalizzazione delle prestazioni quando devi convertire il contenuto del generatore di stringhe in una stringa.

Uno dei vantaggi reali di StringBuilder su stringa è che è possibile passarlo attraverso diversi metodi e aggiungere stringhe lungo il percorso. Non puoi farlo passando un oggetto stringa. Quindi, se si dispone di un'operazione ricorsiva in cui si sta costruendo come un oggetto JSON o qualcosa del genere, è possibile passare a StringBuilder e aggiungere i valori.

11

StringBuilder è, come suggerisce il nome, è utilizzato per build stringhe, mentre le stringhe sono valori di carattere immutabili. Usa le stringhe quando vuoi passare i dati dei personaggi, usa StringBuilder quando vuoi manipolare i dati dei personaggi.

0

Una stringa è buona perché è immutabile. E quello immutabile è buono, è qualcosa di cui si dimostrano le lingue funzionali.

Perché se si dispone di una stringa (di riferimento) "Questa è una stringa" si può essere sicuri che avrà lo stesso valore per sempre. Mentre il valore di un StringBuilder potrebbe essere cambiato (tramite una chiamata al metodo, un altro thread, ecc.).

Tuttavia, a volte è necessario ottimizzare la velocità pura e l'utilizzo della memoria. In tal caso si utilizza un costruttore di stringhe.

Un esempio:

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

Un'analisi di cui utilizzare è fornita a: Concatenating Strings Efficiently.

In sostanza, (sebbene leggere il collegamento per l'analisi completa), utilizzare StringBuilder quando si concatena in un ciclo non banale.

Problemi correlati