La respuesta definitiva deberá venir del equipo de diseño del compilador. Pero déjame tomar una puñalada aquí ...
Si su pregunta es, ¿por qué el compilador no se enciende esto:
string s = "";
for(int i = 0; i < 100; i ++)
s = string.Concat(s, i.ToString());
en esto:
StringBuilder sb = new StringBuilder();
for(int i = 0; i < 100; i++)
sb.Append(i.ToString());
string s = sb.ToString();
La respuesta más probable es que esto no es una optimización. Esta es una reescritura del código que introduce nuevos constructos basados en el conocimiento y la intención que tiene el desarrollador, no el compilador.
Este tipo de cambio requeriría que el compilador tenga más conocimiento del BCL de lo apropiado. ¿Qué pasa si mañana, algún servicio de ensamblaje de cuerdas más óptimo está disponible? ¿Debería el compilador usar eso?
¿Qué pasaría si las condiciones de su ciclo fueran más complicadas, en caso de que el compilador intente realizar algún análisis estático para decidir si el resultado de dicha reescritura aún sería funcionalmente equivalente? En muchos sentidos, esto sería como resolver el halting problem.
Finalmente, no estoy seguro de que en todos los casos esto resulte en un código de ejecución más rápida. Hay un costo al crear una instancia de StringBuilder
y cambiar el tamaño de su búfer interno a medida que se agrega el texto. De hecho, el costo de agregar está fuertemente ligado al tamaño de la cadena que se concatena, cuántos hay, a qué se parece la presión de la memoria. Estas son cosas que el compilador no puede predecir de antemano.
Es su trabajo como desarrollador para escribir código de buen rendimiento. El compilador solo puede ayudar asegurando safe, optimizaciones que preservan invariablemente. No reescribes tu código por ti.
¿Qué es la concatenación de cadenas dinámicas? ¿Tienes un enlace? –
Me refiero a la concatenación de cadenas dinámicas. Su longitud no se conoce en el momento de la compilación. –