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 string
y int
?
a + "" + b + ""
o"" + a + b + ""
, no importa: todo es concatenación de cadenas. Ena + b + ""
sí importa:a
yb
se agregan primero."Expression: " + a
arrojará un error de tiempo de compilación (con Option Strict On),"Expression: " & a
realizará la concatenación de cadenas.Respuestas:
ToString
usoNo, no deberías usar
ToString
aquí.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
ToString
es 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 #.
StringBuilder
se usa cuando necesita realizar muchas operaciones de concatenación y ayuda a reducir la cantidad de cadenas intermedias creadas. Decidir si debe usar unaStringBuilder
concatenación común o no puede ser fácil. Use un generador de perfiles o busque respuestas relevantes en Stack Overflow.El uso
StringBuilder
tiene el inconveniente principal de hacer que el código sea difícil de leer y mantener. Para casos simples como el de su pregunta,StringBuilder
no solo es perjudicial para la legibilidad del código, sino que también es inútil en términos de rendimiento.string.Join
debe usarse cuando necesite agregar delimitadores.Obviamente, nunca lo use
string.Join
con un delimitador vacío para concatenar cadenas.string.Format
se 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.Format
tiene 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.Format
que 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
, anull
se reemplaza por una cadena vacía. ConToString
,NullReferenceException
se 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.Format
es mejor. Ciertamente no es Pythonic para usar+
, y dado que PEP 3101 también%
se desaconseja a favorstr.format
.null
realmente "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 " + i
lo tanto, en realidad no es idéntico a"string " + i.ToString()
ToString()
: el código de OP en un caso,System.String.Concat
la 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.Concat
mé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, laToString
llamada 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