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
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.
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.
- 1. Android StringBuilder vs String Concatenazione
- 2. Generatore di stringhe vs concatenazione di stringhe
- 3. Does StringBuilder utilizza più memoria rispetto alla concatenazione di stringhe?
- 4. Concatenazione di stringhe in Java - quando utilizzare +, StringBuilder e concat
- 5. Concatenazione di stringhe con stringhe()
- 6. Concatenazione di stringhe efficienti in Scala
- 7. StringBuilder append vs +
- 8. Batch concatenazione di stringhe
- 9. concatenazione di stringhe LPWSTR
- 10. Groovy concatenazione di stringhe
- 11. concatenazione di stringhe PHP
- 12. Concatenazione di stringhe vs implode di array in PHP
- 13. Perché utilizzare StringBuilder in modo esplicito se il compilatore converte automaticamente la concatenazione della stringa in un oggetto StringBuilder?
- 14. Stringa Concatenazione non sicura in C#, è necessario utilizzare StringBuilder?
- 15. String concatenazione Vs String Builder Aggiungi
- 16. Varianti di concatenazione di stringhe?
- 17. StringBuffer vs StringBuilder Vs StringTokenizer
- 18. Perché la concatenazione di stringhe non viene convertita automaticamente in StringBuilder in C#?
- 19. Concatenazione di stringhe in Lua
- 20. concatenazione di stringhe con Null
- 21. Concatenazione di stringhe con log4net
- 22. Concatenazione di stringhe in Jinja
- 23. concatenazione di stringhe in css
- 24. concatenazione di stringhe utilizzando JavaScript
- 25. concatenazione di stringhe e caratteri
- 26. Concatenazione di stringhe in EL
- 27. Concatenazione di stringhe con spazi
- 28. concatenazione di stringhe andato funzionale
- 29. Concatenazione di stringhe in VBA
- 30. StringBuilder Vs StringWriter/StringReader