Estoy leyendo un libro llamado .NET Gotchas (vale la pena leer IMO), que ilustra las diferencias de rendimiento entre String y StringBuilder, y me planteó una pregunta que sentía que no podía quedar sin respuesta! Aunque no conozco los aspectos internos de ninguna clase (sin mirar las versiones reflejadas de estas clases), me preguntaba; dado que los operadores en .NET son overloadable, ¿por qué Microsoft no implementó la clase String para usar StringBuilder internamente y sobrecargó los operadores de concatenación para simplemente llamar a .Append() en StringBuilder? Supongo que hay algunas razones subyacentes de por qué este no es el caso, y si es así, ¿por qué?.NET Concatenación de cadenas (+ y + =) vs. StringBuilder
Respuesta
El problema no es tanto que la concatenación de cadenas sea lenta, sino que la concatenación repetida crea una gran cantidad de cadenas intermedias que se deben asignar y, posteriormente, recolectar.
EDITAR
Tenga en cuenta que no añade mystring += "a"
simple "a" a la cadena anterior. Crea una nueva cadena para la combinación y le señala "mystring", descartando el valor anterior (si no hay más referencias al mismo).
FIN EDITAR
Una serie de
string mystring = "something";
mystring += "something else";
mystring = mystring + "third";
llevará a cabo más lento si lo hace cada línea separada como un StringBuilder Anexar seguido de un .ToString() para obtener el resultado de nuevo en una cadena. Solo obtendrá un beneficio de rendimiento si usa un solo StringBuilder, agrega() repetidamente y hace un .ToString() al final.
StringBuilder sb = new StringBuilder();
sb.Append("something");
sb.Append("something else");
sb.Append("third");
string mystring = sb.ToString();
Y luego un StringBuilder tiene su propia cabeza para que no se beneficiará si usted tiene un pequeño número de piezas de cuerda a unirse.
Tenga en cuenta que el compilador optimiza una concatenación de distancia en una sola instrucción:
string mystring = "something" + "something else" + "third";
es más rápido.
La razón es simple:
porque
string result = a + b;
es más eficiente que
var sb = new StringBuilder(a, a.Length + b.Length);
sb.Append(b);
string result = sb.ToString();
StringBuilder
s sólo tienen sentido cuando un montón de concatenaciones están sucediendo, por lo general dentro de un bucle.
- 1. Android StringBuilder vs Concatenación de cadenas
- 2. Concatenación de cadenas en Java: cuándo usar +, StringBuilder y concat
- 3. Concatenación con StringBuilder
- 4. Concatenación de cadenas Vs Generador de cadenas Agregar
- 5. Concatenación de cadenas insegura en C#, ¿necesita usar StringBuilder?
- 6. ¿StringBuilder usa más memoria que la concatenación de cadenas?
- 7. Concatenación de cadenas Formato de cadena VS
- 8. Conjunto de cadenas por StringBuilder vs StringWriter y PrintWriter
- 9. StringBuilder vs Cadena considerando reemplazar
- 10. ¿Por qué usar StringBuilder explícitamente si el compilador convierte la concatenación de cadenas en un StringBuilder automáticamente?
- 11. Cadena de concatenación vs String Builder. Rendimiento
- 12. StringBuilder append vs +
- 13. Eficiencia de concatenación de cadenas de Java
- 14. concatenación de cadenas
- 15. Concatenación de cadenas PHP
- 16. Cadenas de concatenación con
- 17. concatenación de cadenas vs memorias intermedias de cadena en Javascript
- 18. Concatenación de cadenas vs implosión de matriz en PHP
- 19. Concatenación de cadenas y Autoboxing en Java
- 20. PHP concatenación de cadenas y operaciones aritméticas
- 21. Concatenación de cadenas con o sin .ToString()?
- 22. ¿Por qué la concatenación de cadenas no se convierte automáticamente a StringBuilder en C#?
- 23. StringBuffer vs StringBuilder Vs StringTokenizer
- 24. StringBuilder Vs StringWriter/StringReader
- 25. StringBuilder/StringBuffer vs. "+" Operador
- 26. Concatenación de cadenas en MySQL
- 27. concatenación de cadenas con Null
- 28. Concatenación de cadenas en Jinja
- 29. ¿Las cadenas StringBuilder son inmutables?
- 30. StringBuilder vs XmlTextWriter