2009-11-24 15 views
23

Me lo he estado preguntando por un tiempo. ¿Por qué usar String.Concat() en lugar de usar el operador más? Entiendo String.Format, ya que se anula el uso del operador más y mejora la apariencia de su código.¿Por qué usar String.Concat() en C#?

como por ejemplo

string one = "bob"; 
string two = "jim"; 

string three = one + two; 
string three = String.Concat(one,two); 

Respuesta

32

Siempre que los dos operandos sean cadenas, no hay ninguna diferencia entre el uso del operador + y el método String.Concat. El código que utiliza el operador + realmente se compila en una llamada String.Concat.

Usa el que mejor represente tu intención con el código.

+1

¿A qué te refieres con "representar mejor tu intención con el código"? – chobo2

+1

Cualquiera que sea más legible para usted y su equipo de desarrollo. Una cosa buena de String.Concat es que es más fácil * no * simplemente seguir agregando cadenas en línea, lo que no es tan eficaz como utilizar un generador de cuerdas. – Paul

2

Como se puede utilizar la versión que toma dos objetos;)

+0

¿Por qué es esto importante? ¿No puedes hacer .toString()? – chobo2

+0

@ chobo2, Esto se hace implícitamente si llama a 'String.Concat()', por lo que no necesita preocuparse por los tipos de los objetos. – strager

+0

@ chobo2, ¡también debe tener en cuenta los valores nulos! – tster

0

Para ser honesto; algunas personas lo prefieren. Sé que prefiero usar Concat ya que el + realmente no es muy intuitivo. Especialmente solo mirando el código en el fondo; es difícil decir si esos son números que está agregando o dos cadenas de su concatenación o dos puntos con los que está agregando vectores. :)

+4

Si es difícil decir qué es lo que está agregando, es más un problema con el nombramiento variable que el uso del operador +. Por supuesto, si los nombres de variables son malos, la llamada String.Concat aclarará algunas cosas. – Guffa

+1

Estoy de acuerdo. Si no puede ver que dos cadenas se están concatenando, ese es un problema grave con el código o el programador. –

0

Creo que es lo mismo que string a + string b. El tipo de cadena en C# es immutable, por lo tanto, la forma preferida de manipulación de cadenas es a través de StringBuilder. Como Guffa ha concluido "Usa el que mejor represente tu intención con el código". Por supuesto, para un uso sencillo donde el rendimiento no es demasiado preocupante use + o concat.

1

Portabilidad (suya).

En otros idiomas, + podría no concatenarse como se espera cuando se presenta con dos cadenas. Podría hacer algo completamente inesperado. O bien, en algunos lenguajes sueltos si inserta el + entre un entero o una variable escalar numérica y una cadena, puede que no genere una advertencia de compilación, intente convertir el encadenado a un valor numérico y agréguelos.

En comparación, .concat() es bastante obvio y legible en comparación con + en algunos casos.

+0

Por otro lado, si va a programar en un idioma, realmente debe tener alguna pista sobre ese idioma, en lugar de tratar de limitarse a las cosas que se verán igual en todas partes. –

+0

muy cierto, por supuesto. –

5

Yo mismo he estado teniendo esta misma pregunta y esta pregunta provocó que investigue en él un poco,

creé la siguiente clase

public class Class1 
{ 
    string str = "One" + "Team"; 
    string str2 = string.Concat("One", "Team"); 
} 

Y a continuación se corresponde código IL para eso.

.method public hidebysig specialname rtspecialname 
     instance void .ctor() cil managed 
{ 
    // Code size  40 (0x28) 
    .maxstack 8 
    IL_0000: ldarg.0 
    IL_0001: ldstr  "OneTeam" 
    IL_0006: stfld  string StringConcat.Class1::str 
    IL_000b: ldarg.0 
    IL_000c: ldstr  "One" 
    IL_0011: ldstr  "Team" 
    IL_0016: call  string [mscorlib]System.String::Concat(string, string) 
    IL_001b: stfld  string StringConcat.Class1::str2 
    IL_0020: ldarg.0 
    IL_0021: call  instance void [mscorlib]System.Object::.ctor() 
    IL_0026: nop 
    IL_0027: ret 
    // end of method Class1::.ctor 
} 

Para mí sin duda se parece a string.Concat es tener más pasos que operador sobrecargado +. Pero estoy seguro de que dentro de la clase System.String habrá un conjunto similar de operaciones para el operador + sobrecargado también. ¿Pensamientos?

+15

Has usado dos cadenas constantes, por lo que en este caso particular el compilador ha realizado la concatenación por ti. Hazlo con string * variables * y verás que el compilador C# convierte + en una llamada a String.Concat. –

14

Uso + cuando sé cuántas cadenas van a concatenarse, pero ¿y si solo tiene una matriz? En ese caso, no sabría cuántas veces aplicar +, por lo que tendría tiene para llamar a un método (o bucle usted mismo, que es horrible).

No recuerdo haber llamado string.Concat con mucha frecuencia, es una rareza definitiva.

Como dice Guffa, + compila abajo en las llamadas a string.Concat de todos modos - que vale la pena ser consciente de que string en realidad no tienen un operador +, que puede ser una causa de confusión si alguna vez intenta utilizarlo en la reflexión !

Sin embargo, si todos los argumentos son expresiones constantes, el compilador realizará la concatenación por usted, por lo que no necesita hacerlo en tiempo de ejecución. Ese tipo de pequeño beneficio de rendimiento no va a ser significativo en la mayoría de los códigos, pero siempre es bueno cuando el código me parece más legible también tiene una ventaja de rendimiento :)

0

El operador + es un operador matemático. Por lo tanto, antes de concatenar la cadena utilizando ese operador, el compilador tendrá que decidir si usarlo como un operador matemático para sumar o usarlo para la concatenación de cadenas.

Por ejemplo: si está concatenando a + b + c + d + e + f, el compilador tomará la decisión 5 veces ya que hay 5 operadores +.

Rendimiento no es recomendable.

Sin embargo, si usted tiene sólo una concatenación de hacer, i `t creo que haya mucha diferencia en términos de rendimiento al utilizar el método concat() + o