2012-08-02 11 views
5

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

6

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.

5

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.

Cuestiones relacionadas