2009-02-09 14 views
13

Eventuali duplicati:
String vs StringBuilderQuando usare StringBuilder?

Ho appena rivisitato alcuni dei libri che ho usato per raccogliere VB.NET. Non sono sicuro di averlo nella mia testa, capire come/cosa sia StringBuilder.

Qual è la guida per l'utilizzo? È meglio usarlo se si concatenano 2 stringhe o 50?

Oppure quando la lunghezza totale della stringa è maggiore di 128 caratteri?

Oppure vedrai un vantaggio in termini di prestazioni ogni volta che lo utilizzi per aggiungere stringhe insieme?

In tal caso è meglio utilizzare un'istanza StringBuilder per creare un'istruzione SQL rispetto a string.format("Select * from x where y = {0}",1)?

Mi ha sempre colpito il fatto che dichiarare un'altra variabile e includere uno spazio per il nome non è vantaggiosa per le concatenazioni di stringhe di piccole dimensioni, ma non ne sono sicuro ora.

Scusa, molta documentazione ti dice cosa usare, ma non è il massimo.

+0

Prova questa domanda: [http://stackoverflow.com/questions/73883/string-vs-stringbuilder](http://stackoverflow.com/questions/73883/string-vs-stringbuilder) –

risposta

32

Ho uno article on this very topic. In sintesi (copiato dalla parte inferiore della pagina):

  • usano Decisamente StringBuilder quando si concatenare in un ciclo non banale - soprattutto se non si sa per certo (al momento della compilazione) quante iterazioni farai il giro. Ad esempio, leggendo un file un carattere alla volta, costruire una stringa mentre si utilizza l'operatore + = è potenzialmente un suicidio.
  • Utilizzare definitivamente l'operatore di concatenazione quando è possibile (leggibile) specificare tutto ciò che deve essere concatenato in una dichiarazione. (Se hai una serie di cose da concatenare, considera se chiamare String.Concat in modo esplicito o String.Join se hai bisogno di un delimitatore.)
  • Non aver paura di rompere i letterali in più bit concatenati - il risultato sarà lo stesso. Puoi aiutare la leggibilità rompendo un lungo letterale in più righe, ad esempio, senza alcun danno alle prestazioni.
  • Se avete bisogno dei risultati intermedi della concatenazione per qualcosa di diverso da quello di alimentare la successiva iterazione della concatenazione, StringBuilder non vi aiuterà. Ad esempio, se si crea un nome completo da un nome e un cognome, e quindi si aggiunge una terza informazione (il soprannome, forse) alla fine, si trarrà beneficio dall'uso di StringBuilder solo se non lo si fa. serve la stringa (nome + cognome) per altri scopi (come facciamo nell'esempio che crea un oggetto Person).
  • Se hai solo alcune concatenazioni da fare e vuoi veramente farlo in dichiarazioni separate, non importa in che direzione vai. Il modo più efficiente dipenderà dal numero di concatenazioni in cui sono coinvolte le dimensioni della stringa e dall'ordine in cui sono concatenate. Se si ritiene che quel pezzo di codice sia un collo di bottiglia per le prestazioni, un profilo o un benchmark in entrambe le direzioni.
+1

Curioso, hai mai profilato un StringBuilder contro String.Concat (theStrings.ToArray())? String.Concat è in realtà un metodo piuttosto efficace. – JaredPar

+0

Se possiedi già tutte le stringhe necessarie in un array, allora mi aspetterei che String.Concat sia molto veloce - può risolvere perfettamente la dimensione richiesta per iniziare. Dovendo convertire la lista in una matrice per iniziare è sfortunato, attenzione. A String.Concat (IList ) sarebbe bello. –

+0

Oh, e in altre notizie: taglia e incolla per la vittoria;) –

12

Qui è la mia regola empirica:

StringBuilder è meglio utilizzato quando il numero esatto di concatenazioni non è nota al momento della compilazione.

+0

Ok in modo che significherebbe che il 99% delle applicazioni di database non userebbe il costruttore di stringhe per costruire l'istruzione SQL, ma a volte non sei sicuro di quante "posizioni" si andranno a concatenare fino alla fine, sarà sempre 1 ... ma non dovrebbe essere più di 3, useresti ancora il stringbuilder per questo? – spacemonkeys

+0

È una buona regola generale, ma occasionalmente se stai costruendo una stringa molto grande, eppure non usi loop, un StringBuilder sarebbe meglio. –

+0

@BC - buon punto: le regole del pollice hanno sempre delle eccezioni :) –

0

Personalmente uso StringBuilder quando ho più di una o due stringhe per concatenare. Non sono sicuro che ci sia un vero successo in termini di prestazioni, ma ho sempre letto e mi è stato detto che fare una normale concatenazione con più stringhe crea una copia extra della stringa ogni volta che lo fai, mentre StringBuilder ne conserva uno copia finché non chiami il metodo finale ToString() su di esso.

0

Qualcuno ha scoperto sperimentalmente che il numero critico è 6. Più di 6 concatenazioni di fila e si dovrebbe usare un oggetto StringBuilder. Non ricordo dove ho trovato questo.

Tuttavia, tenere presente che se si scrive questo in una riga:

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

che viene convertita in una chiamata di funzione (non so come scrivere in VB.net)

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

Quindi, se stai facendo tutte le concatenazioni su una riga, non preoccuparti di StringBuilder perché String.Concat eseguirà tutte le concatenazioni in un colpo solo. È solo se le stai facendo in loop o in concatenazione in successione.

0

Mia regola: quando si aggiunge a una stringa in un ciclo For o Foreach, utilizzare StringBuilder.