¿Cuál es la diferencia entre +
y &
para unir cadenas en VB.NET?La diferencia entre + y & para unir cadenas en VB.NET
Respuesta
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.
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
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.
+ 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
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 :)
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.
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.
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
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
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
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
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! :-)
- 1. Diferencia entre DirectCast() y CType() en VB.NET
- 2. Diferencia entre Tenedor/Unir y Mapa/Reducir
- 3. Diferencia entre ASP.Net, C# .Net y VB.Net?
- 4. Unir matrices en VB.NET
- 5. Diferencia entre sombras (VB.NET) y nuevo (C#)
- 6. Diferencia entre cadenas entre comillas simples y dobles en ActionScript
- 7. ¿Cómo encontrar la diferencia entre dos cadenas?
- 8. Unir cadenas con nodo XML entre en scala
- 9. Cuál es la diferencia entre (As) y (=) en la declaración objeto en VB.NET
- 10. Agregue una línea de corte entre cadenas concatenadas en VB.net
- 11. Cuál es la diferencia entre = y: =
- 12. La diferencia entre $ * y $ @
- 13. Diferencia entre '.' y "." en java
- 14. Diferencia entre Dim y Privado
- 15. ¿Cómo se encuentra la diferencia entre 2 cadenas en PHP?
- 16. ¿Cuál es la diferencia entre una propiedad parametrizada y la función en vb.net?
- 17. Resalta la diferencia entre dos cadenas en PHP
- 18. MySQL: diferencia entre ', `,' y"
- 19. ¿Cuál es la diferencia entre cadenas de C y cadenas de C++?
- 20. Encontrar la posición de la diferencia entre dos cadenas
- 21. ¿Diferencia entre estas cadenas de conexión?
- 22. Diferencia entre dosisq y para en Clojure
- 23. Reemplazo de caracteres en cadenas en VB.NET
- 24. ¿Cuál es la diferencia entre 'foo = Nothing' y 'foo is Nothing' en VB.NET?
- 25. ¿Cuál es la diferencia entre una solución y un proyecto en vb.net?
- 26. diferencia entre dos cadenas de C#
- 27. diferencia entre System.out.printf y String.format
- 28. Unir una matriz de cadenas en Apex
- 29. Python: La diferencia entre usar "y "
- 30. Comparar dos cadenas y obtener la diferencia
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
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
@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