2012-08-02 14 views
5

Sto leggendo un libro intitolato .NET trucchi (merita una lettura IMO), che illustra le differenze di prestazioni tra String e StringBuilder, e ha sollevato una questione che ho sentito non poteva rimanere senza risposta! Mentre non conosco gli interni di nessuna classe (senza guardare le versioni riflesse di queste classi), mi stavo chiedendo; dal momento che gli operatori di .NET sono sovraccarichi, perché Microsoft non ha implementato la classe String per utilizzare StringBuilder internamente e sovraccaricare gli operatori di concatenazione per chiamare semplicemente .Append() in StringBuilder? Sto indovinando ci sono alcune ragioni sottostanti al motivo per cui questo non è il caso, e se sì, perché?.NET concatenazione di stringhe (+ & + =) vs. StringBuilder

risposta

6

Il problema non è tanto che la concatenazione di stringhe è lento, è più che ripete la concatenazione crea un sacco di stringhe intermedi che devono essere assegnati e poi garbage collection.

EDIT
Nota che mystring += "a" non lo fa semplice add "a" alla stringa precedente. Crea una nuova stringa per la combinazione e punta "mystring" su di essa, quindi scartando il valore precedente (se non ci sono più riferimenti ad esso).

FINE EDIT

Una serie di

string mystring = "something"; 
mystring += "something else"; 
mystring = mystring + "third"; 

eseguirà più lento se si fa ogni riga separata come StringBuilder Append seguito da un .ToString() per ottenere il risultato di nuovo in una stringa. Si otterrà un vantaggio in termini di prestazioni solo se si utilizza un singolo StringBuilder, Append() su di esso ripetutamente e si esegue un .ToString() alla fine.

StringBuilder sb = new StringBuilder(); 
sb.Append("something"); 
sb.Append("something else"); 
sb.Append("third"); 
string mystring = sb.ToString(); 

E poi uno StringBuilder ha la propria testa in modo che non si andrà a beneficio se si dispone di un numero ridotto di stringa-parti di aderire.

Nota che il compilatore ottimizza via una concatenazione in una singola istruzione:

string mystring = "something" + "something else" + "third"; 

è più veloce.

5

La ragione è semplice:

perché

string result = a + b; 

è più efficiente rispetto

var sb = new StringBuilder(a, a.Length + b.Length); 
sb.Append(b); 
string result = sb.ToString(); 

StringBuilder s senso solo quando un sacco di concatenazioni stanno accadendo, di solito all'interno di un ciclo.

Problemi correlati