2009-04-09 19 views

Respuesta

67

No hay diferencia si ambos operandos son cadenas. Sin embargo, si un operando es una cadena, y uno es un número, entonces tiene problemas, vea el código a continuación.

"abc" + "def" = "abcdef" 
"abc" & "def" = "abcdef" 
"111" + "222" = "111222" 
"111" & "222" = "111222" 
"111" & 222 = "111222" 
"111" + 222 = 333 
"abc" + 222 = conversion error 

lo tanto, recomendamos utilizar siempre & cuando quiere decir para concatenar, ya que podría estar tratando de concatenar un entero, flotante, decimal a una cadena, lo que provocará una excepción, o en el mejor, no lo hacen lo probablemente quieras que haga.

+11

O siempre haga cumplir Option Strict On, en cuyo caso nunca tendrá que preocuparse por ello. Option Strict On tiene muchas otras ventajas también: http://stackoverflow.com/questions/222370/option-strict-on-and-net-for-vb6-programmers – mattmc3

+3

Hay un problema con '&' para la concatenación de cadenas. De la [documentación] (http://msdn.microsoft.com/en-us/library/te2585xw.aspx) "El operador & siempre ensancha sus operandos a String, independientemente de la configuración de Option Strict". Entonces, por ejemplo, "Hello" & 2.5' convertirá silenciosamente el 2.5 a una cadena usando la configuración regional (es posible que obtenga '" 2.5 "' o '" 2,5 "'). Bien si eso era lo que querías. Preferiría mucho, mucho más, ser forzado a especificar explícitamente. – MarkJ

+0

@MarkJ Oh sí, esas cosas regionales realmente pueden atraparte si no lo miras. Especialmente en servidores web. Si tiene un montón de servidores web, debe asegurarse de que estén configurados para la misma configuración regional, le permite obtener problemas de formato con números y fechas. – Kibbee

0

Ninguno cuando se unen cadenas:

Dim string1 As String = "A" + "B" 
    Dim string2 As String = "A" & "B" 

    If string1.Equals(string2) And string2.Equals(string1) Then 
     Debugger.Break() 
    End If 
12

El operador & siempre se asegura de que los dos operandos son cadenas, mientras que el operador + se encuentra la sobrecarga que coincide con los operandos.

La expresión 1 & 2 da el valor "12", mientras que la expresión 1 + 2 da el valor 3.

Si ambos operandos son cadenas, no hay ninguna diferencia en el resultado.

+0

+ el operador solo lleva a cabo la conversión implícita si 'Option Strict' está' Off'. Pero & operator llevará a cabo una conversión implícita a cadena independientemente de la configuración 'Option Strict'. [Documentation] (http://msdn.microsoft.com/en-us/library/te2585xw.aspx) "El operador & siempre ensancha sus operandos a String, independientemente de la configuración de Option Strict". Entonces, por ejemplo, "Hello" & 2.5' convertirá silenciosamente el 2.5 a una cadena usando la configuración regional (es posible que obtenga '" 2.5 "' o '" 2,5 "'). Bien si eso era lo que querías. – MarkJ

2

No hay diferencia en la mayoría de los casos. Sin embargo, la mejor práctica es:

"+" debe reservarse para adiciones enteros, porque si no se utiliza Option Strict On entonces puede que haya muy mal estado situaciones tales como:

Input + 12 podría darle 20 en lugar de 812. Esto puede ser especialmente malo en una aplicación ASP.NET donde la entrada proviene de POST/GET.

En pocas palabras: Para unir cadenas, utilice siempre "&" en lugar de "+".

Obviamente, utilice StringBuilder donde es adecuado :)

3

El operador + puede ser una adición o concatenación. El & es solo una concatenación. Si las expresiones son ambas cadenas, los resultados serían los mismos.

Uso & cuando trabajo con cadenas, y + cuando trabajo con números, por lo que nunca hay confusión acerca de mi intención. Si por error usa + y una expresión es una cadena y una es un número, corre el riesgo de obtener resultados no deseados.

1

Si ambos tipos están tipados estáticamente a System.String, no hay diferencia entre el código. Ambos se resolverán hasta el miembro String.Concat (esto es lo que + hace para las cadenas).

Sin embargo, si los objetos no se escriben con fuerza en la cadena, el enlace tardío de Visual Basic se activará e irá por dos rutas muy diferentes. La versión + intentará hacer una operación add que literalmente intenta agregar los objetos. Esto hará todo tipo de intentos para convertir ambos valores a un número y luego agregarlos.

El operador & intentará concatenar. El tiempo de ejecución de Visual Basic pasará por todo tipo de conversiones para convertir ambos valores en cadenas. A continuación, String.Concat los resultados.

+0

También vale la pena mencionar que el operador '&' ** ignora Option Strict **. De la [documentación] (http://msdn.microsoft.com/en-us/library/te2585xw.aspx) "El operador & siempre ensancha sus operandos a String, independientemente de la configuración de Option Strict". Entonces, por ejemplo, "Hello" & 2.5' convertirá silenciosamente el 2.5 a una cadena usando la configuración regional (es posible que obtenga '" 2.5 "' o '" 2,5 "'). Bien si eso era lo que querías. Contraste con '+' que es estricto cuando 'Option Strict On' – MarkJ

7

Ninguno.

Como puedes ver a continuación. Estas dos líneas de código se compila exactamente al mismo código IL:

Module Module1 

Sub Main() 
    Dim s1 As String = "s1" 
    Dim s2 As String = "s2" 
    s2 += s1 
    s1 &= s2 
End Sub 

End Module 

se compila a (nota System.String::Concat):

.method public static void Main() cil managed 
{ 
.entrypoint 
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = (01 00 00 00) 
// Code size  31 (0x1f) 
.maxstack 2 
.locals init ([0] string s1, 
     [1] string s2) 
IL_0000: nop 
IL_0001: ldstr  "s1" 
IL_0006: stloc.0 
IL_0007: ldstr  "s2" 
IL_000c: stloc.1 
IL_000d: ldloc.1 
IL_000e: ldloc.0 
IL_000f: call  string [mscorlib]System.String::Concat(string, 
                  string) 
IL_0014: stloc.1 
IL_0015: ldloc.0 
IL_0016: ldloc.1 
IL_0017: call  string [mscorlib]System.String::Concat(string, 
                  string) 
IL_001c: stloc.0 
IL_001d: nop 
IL_001e: ret 
} // end of method Module1::Main 
+0

Gracias Aliostad, que lo resume perfectamente. Estaba muy curioso (y probablemente debería haberlo esbozado un poco mejor en mi pregunta) sobre cómo se manejó. String + String (siempre que ambas sean cadenas) es lo mismo que String & String (independientemente de un complejo conjunto de reglas con el operador +). – rickp

+0

Sin problemas. Siempre es bueno echar un vistazo al código IL utilizando ILDASM. Inicialmente no es familiar, pero poco a poco te acostumbras. – Aliostad

1

Directamente desde MSDN Documentación: Concatenation Operators in Visual Basic

diferencias entre los dos Operadores de concatenación

El + Operador (Visual Basic) tiene el pri mary propósito de agregar dos números . Sin embargo, también puede concatenar operandos numéricos con operandos de cadena . El operador + tiene un conjunto complejo de reglas que determinan si agregar, concatenar, señalar un error del compilador o lanzar una excepción InvalidCastException en tiempo de ejecución .

El & operador (Visual Basic) se define solamente para operandos de cadena, y siempre se ensancha sus operandos de cadena, independientemente de la configuración de Option Strict. El operador & se recomienda para la concatenación de cadenas porque está definido exclusivamente para cadenas y reduce sus posibilidades de generar una conversión involuntaria.

¡Confíe en MSDN! :-)

Cuestiones relacionadas