int a = 1;
int b = 2;
int sum = a + b;
string expression = "Expression: " + a + " + " + b + " = " + sum;
Console.WriteLine(expression); //displays Expression 1 + 2 = 3
¿Debo usar:
string expression = "Expression: " + a + " + " + b + " = " + sum;
o
string expression = "Expression: " + a.ToString() + " + " + b.ToString() + " = " + result.ToString();
¿Se recomienda usar ToString()al concatenar stringy int?

a + "" + b + ""o"" + a + b + "", no importa: todo es concatenación de cadenas. Ena + b + ""sí importa:aybse agregan primero."Expression: " + aarrojará un error de tiempo de compilación (con Option Strict On),"Expression: " & arealizará la concatenación de cadenas.Respuestas:
ToStringusoNo, no deberías usar
ToStringaquí.La concatenación de cadenas transforma automáticamente las no cadenas en cadenas, lo que significa que sus dos variantes son casi idénticas:
Fuente: Especificación del lenguaje C #: operador de adición, MSDN .
Por otro lado, el primero (sin
ToString):Así que prefiere el primero.
Bajo el capó
Lo que también es interesante es ver qué sucede debajo del capó. Una de las formas de verlo es mirar el código IL dentro de LINQPad. Este programa:
se traduce a la siguiente IL:
¿Ves eso
System.String.Concat? Eso significa que el código original también se puede escribir así, lo que se traduce exactamente en el mismo IL:Cuando lea la documentación de
string.Concat(object[]), puede aprender que:Esto significa que
ToStringes redundante. También:Lo que maneja muy bien el caso donde algunos de los operandos son nulos (vea la nota al pie 1).
Mientras que en el último ejemplo, se tradujo la concatenación
string.Concat, también se deben resaltar las optimizaciones del compilador:se traduce en:
Por otra parte:
se traduce en:
Otras alternativas
Por supuesto, hay otras formas de concatenar representaciones en cadena de objetos en C #.
StringBuilderse usa cuando necesita realizar muchas operaciones de concatenación y ayuda a reducir la cantidad de cadenas intermedias creadas. Decidir si debe usar unaStringBuilderconcatenación común o no puede ser fácil. Use un generador de perfiles o busque respuestas relevantes en Stack Overflow.El uso
StringBuildertiene el inconveniente principal de hacer que el código sea difícil de leer y mantener. Para casos simples como el de su pregunta,StringBuilderno solo es perjudicial para la legibilidad del código, sino que también es inútil en términos de rendimiento.string.Joindebe usarse cuando necesite agregar delimitadores.Obviamente, nunca lo use
string.Joincon un delimitador vacío para concatenar cadenas.string.Formatse puede usar cuando se prefiere la plantilla de cadenas a la concatenación de cadenas. Uno de los casos en los que puede preferir eso es cuando el mensaje puede estar localizado, como lo sugiere la respuesta de kunthet.El uso
string.Formattiene varios inconvenientes que lo hacen inadecuado para casos simples como el suyo:Con marcadores de posición simples "{0}", a menudo no está claro qué parámetro va a dónde. Es frecuente invertir por error los parámetros u olvidar uno. Afortunadamente, C # 6 finalmente introduce la interpolación de cadenas que resuelve este problema.
El rendimiento del tiempo de ejecución puede degradarse. Por supuesto, no asumas
string.Formatque siempre es más lento. Si el rendimiento es importante, mida dos enfoques y determine cuál es más rápido en función de sus resultados reales en lugar de suposiciones.El código es un poco más largo de escribir, más largo de leer y más difícil de mantener, aunque esto es extremadamente menor y no debería molestarlo demasiado.
¹ La diferencia aparece cuando uno de los objetos es
null. SinToString, anullse reemplaza por una cadena vacía. ConToString,NullReferenceExceptionse arroja un.fuente
+se considera una mala práctica en la mayoría de los idiomas. En este caso lo usaríastring.Concat, en muchos casosstring.Formates mejor. Ciertamente no es Pythonic para usar+, y dado que PEP 3101 también%se desaconseja a favorstr.format.nullrealmente "manejarlo bien"? Bueno, no es tan malo como "en la reanudación de error siguiente" ...Concat(object[])se usará en lugar deConcat(string[]). Por"string " + ilo tanto, en realidad no es idéntico a"string " + i.ToString()ToString(): el código de OP en un caso,System.String.Concatla implementación de en el otro caso. Entonces, la respuesta sigue siendo válida: no escriba el código que no tiene ningún beneficio.En su lugar, debe usar formateador de cadenas. Es más fácil formatear su número en representación de cadena o localización. p.ej:
Más información sobre MSDN .
Sin embargo, el formateador de cadenas es menos legible (y quizás también de rendimiento) que la concatenación de cadenas.
fuente
Si usa
+concatenación, en sí mismo usa elString.Concatmétodo. La cadena en sí no expone un operador +.por ejemplo:
se compila en:
Si llama directamente
ToString, evitará el boxeo y llamará a laConcat(string, string)sobrecarga. Por lo tanto, laToStringllamada será un poco más eficiente, aunque no lo suficientemente significativa. Será mejor que sigas con el ejemplo que crees que es más legible.fuente