2011-01-25 12 views
5

Eventuali duplicati:
C# String output: format or concat?Ci sono vantaggi nell'uso della formattazione di stringhe rispetto alla concatenazione di stringhe?

qual è il vantaggio di utilizzare questo:

Console.WriteLine("{0}: {1}", e.Code, e.Reason); 

VS. this:

Console.WriteLine(e.Code + ": " + e.Reason); 

????

+0

Si consiglia di guardare il codice disassemblato per vedere se vi sia una significativa differenza di prestazioni. Personalmente preferisco il primo. – fardjad

+0

Sono continuamente sconvolto da chi trova gli specificatori di formato * più leggibili * rispetto alle semplici concatenazioni. Non dirmi che non hai mai digitato male quelle parole e hai dovuto tornare indietro e correggere un bug a causa di ciò. Inoltre, vedere [questo post di blog] (http://geekswithblogs.net/BlackRabbitCoder/archive/2010/05/10/c-string-compares-and-concatenations.aspx). Come risulta, la concatenazione semplice ('+') è la migliore per concatenare (set abbastanza piccoli), 'StringBuilder' è la cosa migliore quando è necessario creare un ciclo, e' Format' è il migliore per la formattazione. Il vantaggio in termini di prestazioni dell'uso di 'Format' su' + 'è ** trascurabile al meglio **. –

risposta

3

Per me, i benefici del ciondolo string.Format sono:

  • Migliorata la leggibilità
  • Meglio traducibile

Dal punto di vista delle prestazioni, ho fatto mai fare alcuna misurazione; potrebbe benissimo essere che la concatenazione sia più veloce del ciondolo string.Format.

3

In pratica, l'unica differenza è che il primo permette di controllare il layout

string.Format("*{0:3}*",1); // * 1* 

o il controllo della formattazione:

string.Format("*{0:c}*",1); // *$1.00* 

Le prestazioni di concatenazione può essere considerato quando si fa un sacco di esso in anelli stretti, nel qual caso StringBuilder.Append e StringBuilder.AppendFormat sono entrambi molto preferiti. AppendFormat e string.Format sono molto vicini, in termini di prestazioni, quindi non è necessario sostituire il secondo per il primo.

+0

Il layout può essere eseguito tramite i numerosi overload ToString, spesso accettando un pattern –

+0

@Marc ma passando dal suo esempio ..... – Will

4

Il motivo per cui utilizzo sempre .Format() è per la risoluzione e di conseguenza la riduzione dei bug e i vantaggi di manutenzione. Ovviamente questo non ha senso se sei relativamente nuovo al codice dato che il secondo esempio è inizialmente più intuitivo. Il primo appare inutilmente complesso.

Tuttavia, se si sceglie il secondo motivo, si iniziano ad avere problemi quando si hanno molte variabili. È qui che è più facile apprezzare i benefici del primo schema.

es

Console.Writeline(var1 + " " + var2 + "-" + var3 + 
" some sort of additional text" + var4); 

Nota l'errore: ho bisogno di un altro spazio dopo "testo", ma che non è facile vedere in questo esempio.

Tuttavia se lo faccio il contrario:

Console.Writeline("{0} {1}-{2} some sort of additional text{3}", 
var1, var2, var3, var4) 

E 'chiaro per vedere cosa sta succedendo. È più facile apprezzare il risultato finale quando dividi la formattazione dalle variabili che verranno utilizzate.

Se vogliamo pensare ancora più a lungo termine, allora aiuta con la globalizzazione/personalizzazione. Se mettiamo le stringhe di formato in configurazione, possiamo quindi modificare la formattazione o l'ordine delle variabili senza toccare il codice.

-2

Poiché le stringhe sono immutabili (non è possibile modificare una stringa esistente deve crearne una nuova ogni volta) il formato della stringa può avere vantaggi prestazionali poiché non creerà più riferimenti di memoria.

result = string1 + " " + string2 + " " + string3

Questo crea 10 referenze

  • risultato
  • string1
  • stringa2
  • string3
  • ""
  • ""
  • .210
  • stringa1 + ""
  • stringa1 + "" + stringa2
  • stringa1 + "" + stringa2 + ""
  • stringa1 + "" + stringa2 + "" + stringa 3

result = string.Format("{0} {1} {2}", string1, string2, string3)

Questo crea 5 riferimenti

  • risultato
  • stringa1
  • stringa2
  • string3
  • "{0} {1} {2}"
+2

Il primo semplicemente non è vero; questa è una chiamata a string.Concat, che misura tutte le stringhe, prealloca lo spazio corretto e le copia. Nessuna stringa intermedia. –