17

Possibili duplicati:
Is String.Format as efficient as StringBuilder
C# String output: format or concat?String.Format vs "string" + "string" o StringBuilder?

Qual è la priorità delle prestazioni e quali dovrebbero essere le condizioni per preferire ciascuno dei seguenti:

String.Format("{0}, {1}", city, state); 

o

city + ", " + state; 

o

StringBuilder sb = new StringBuilder(); 
sb.Append(city); 
sb.Append(", "); 
sb.Append(state); 
sb.ToString(); 
+2

@Shimmy: guarda questo http://stackoverflow.com/questions/6785/is-string-format-as-efficient-as-stringbuilder – shahkalpesh

+0

http: //blogs.msdn.com/b/ricom/archive/2004/03/12/performance-quiz-1-of-a-series.aspx – Freelancer

+1

http://www.codinghorror.com/blog/archives/001218.html – Freelancer

risposta

18
  • compilatore di ottimizzare tanto concat stringa che può, così per esempio stringhe che sono appena rotto per scopi di interruzione di riga solito può essere ottimizzata in una singola stringa letterale.
  • concatenazione con le variabili otterrà compilato in String.Concat
  • StringBuilder può essere molto più veloce se si sta facendo diverse (più di 10 o giù di lì credo) "modifiche" in una stringa, ma porta un certo overhead in più perché alloca più spazio del necessario nel suo buffer e ridimensiona il suo buffer interno quando è necessario.

Io personalmente uso String.Format quasi tutto il tempo per due motivi:

  • E 'molto più facile da mantenere la stringa di formato di riorganizzare un gruppo di variabili.
  • String.Format accetta un IFormatProvider che viene passato a tutti i tipi IFormattable incorporati nella stringa (come i valori numerici) in modo da ottenere una formattazione numerica appropriata per la cultura specificata e, in generale, solo un maggiore controllo sul modo in cui i valori vengono formattati.

Per esempio, dal momento che alcune culture utilizzano una virgola come separatore decimale si vorrebbe per assicurare sia con StringBuilder o String.Format specificato CultureInfo.InvariantCulture se ci si vuole assicurare che i numeri sono stati formattati il ​​modo in cui si intende .

Altri due cosa da notare ...

  • StringBuilder ha anche una funzione AppendFormat che ti dà la flessibilità di String.Format senza richiedere un secondo tampone non necessaria.
  • Quando si utilizza StringBuilder, assicurarsi di non annullare lo scopo concatenando i parametri passati ad Aggiungi. È facile da perdere.
1

Non c'è diference rilevante. Ma supponendo che String.Format utilizzi internamente un StringBuilder (lo si può vedere con lo strumento Reflector), utilizzando direttamente StringBuilder.Append dovrebbe essere più veloce.

MODIFICA: Ovviamente l'uso dell'operatore "+" è l'opzione peggiore poiché crea una nuova istanza di stringa per ogni stringa che si concatena.

+0

sbagliato, in base al link che ho postato qui sotto sembra che + è il modo migliore – Shimmy

+1

@shimmy, Non c'è StringBuilder in quel collegamento. Inoltre, in quel test, concatenate solo 3 stringhe, il numero delle stringhe influisce molto sulla performance. –

+0

La modifica è sbagliata. Il compilatore C# assemblerà le stringhe o gli oggetti in una matrice e quindi inviterà String.Concat(). Prevedo che String.Concat (stringa []) sia il più efficiente poiché l'implementazione può allocare la stringa esattamente alla lunghezza corretta. –