metodos - vb.net list
La diferencia entre+y & para unir cadenas en VB.NET (8)
¿Cuál es la diferencia entre +
y &
para unir cadenas en VB.NET?
Directamente desde la documentación de MSDN: operadores de concatenación en Visual Basic
Diferencias entre los dos operadores de concatenación
El + Operador (Visual Basic) tiene el propósito principal 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.
The & Operator (Visual Basic) está definido solo para operandos String, y siempre amplía sus operandos a String, 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 las posibilidades de que genere una conversión involuntaria.
¡Confíe en MSDN! :-)
El operador & siempre se asegura de que ambos operandos sean cadenas, mientras que el operador + 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 diferencia en el resultado.
El operador + puede ser suma o concatenación. El & es solo 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 sobre 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.
Ninguna.
Como puede ver abajo. Estas dos líneas de código se compilan exactamente con el 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
Compila para (note 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
Ninguno al unir 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
No hay diferencia en la mayoría de los casos. Sin embargo, la mejor práctica es:
"+" debe reservarse para adiciones de enteros , porque si no usa Option Strict On entonces podría haber realmente enredado situaciones tales como:
Input + 12
puede dar 20
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, siempre use "&" en lugar de "+".
Obviamente, use StringBuilder donde sea adecuado :)
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
Por lo tanto, le recomiendo utilizar siempre &
cuando quiera concatenar, ya que podría tratar de concatenar un entero, flotante, decimal en una cadena, lo que provocará una excepción, o en el mejor de los casos, no hará lo que probablemente quiera hacer.
Si ambos tipos se escriben estáticamente en System.String , no hay diferencia entre el código. Ambos se resolverán con 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 iniciará y se ejecutará en dos rutas muy diferentes. La versión +
intentará hacer una operación de agregar 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.