2012-02-23 8 views
10

Recientemente se me ha informado de que es posible concatenar números enteros (y de otros tipos) a la cadena y viceversa, es decirAdición de números enteros a cadenas en C#

// x == "1234" 
// y == "7890" 
string x = "123" + 4; 
string y = 7 + "890"; 

Por alguna razón, no creo que este tipo de se dejó cosa, así que siempre he estado usando (desde .NET 2) la forma:

// x == "1234" 
// y == "7890" 
string x = "123" + 4.ToString(); 
string y = 7.ToString() + "890"; 

donde los enteros se convierten en cadenas. ¿La versión anterior siempre estuvo disponible, y la he echado de menos, o es algo nuevo para C# 4 (que es lo que estoy usando ahora)?

+0

Es solo tipo de conversión en acción, sin duda en torno a las versiones anteriores. Es probable que ambos compilen en el mismo formulario MSIL. – Rudu

+0

Oh, sí, mirando hacia atrás en los documentos de estándares de codificación veo que me animaron a ser explícito en mi código para hacerlo más legible. 'var x = value + 10' podría ser cualquier cosa, por ejemplo, mientras que 'string x = value + 10.ToString()' deja poco a la imaginación. –

Respuesta

17

Esto siempre ha estado ahí. El + es equivalente a string.Concat() si al menos uno de los operandos es una cadena. string.Concat() tiene una sobrecarga que toma una instancia de object. Internamente llamará al método ToString() del objeto antes de concatenar.

Encontrado la sección correspondiente en la especificación C# - sección operador 7.7.4 Adición:

concatenación de cadenas:

string operator +(string x, string y); 
string operator +(string x, object y); 
string operator +(object x, string y); 

El binario + operador lleva a cabo la concatenación de cadenas cuando uno o ambos los operandos son de tipo cadena. Si un operando de concatenación de cadenas es nulo, se sustituye una cadena vacía. De lo contrario, cualquier argumento que no sea de cadena se convierte a su representación de cadena invocando el método de ToString virtual heredado del tipo de objeto. Si ToString devuelve nulo, se sustituye una cadena vacía.

+0

Sin embargo, es bastante seguro que tiene alguna comprobación nula, por lo que no es totalmente equivalente a simplemente invocar .ToString en el otro objeto (si ese objeto es anulable). – Servy

+4

Esto. Lo que significa "+" depende del contexto según el valor de la izquierda. Si es numérico, es una adición matemática. Si es una cadena, es concatenación. Si es un tipo definido por el usuario, el método del operador definirá el (los) tipo (s) esperado (s) de RValue, y el comportamiento del operador dado un tipo esperado de RValue. – KeithS

+0

Si 7 está en el lado izquierdo del "+", debería llamar al operador + en un número entero. Parece que admiten cadenas allí. MSDN escribe "Console.WriteLine (5.0 +" 5 "); // cadena de concatenación // nota conversión automática de doble a cadena" << ese comentario es interesante – BlueM

2

Por supuesto, la mejor respuesta es utilizar algún tipo de:

String.Format("{0},{1}", "123", 4); 
+5

¿Por qué exactamente es el mejor ?! – gdoron

+0

Acepto (siendo más explícito, aunque tu forma no es la misma), no creo que solo 'agregar' cadenas y enteros sea el mejor plan, especialmente cuando obtienes código como 'var x = value + 10' –

+0

Intenta usar el método String.Concat al menos si quieres el entero 1234 + "10", no terminará siendo 1244, ¿tiene sentido esto? – MethodMan

Cuestiones relacionadas