Quelle est la différence entre +
et &
pour joindre des chaînes dans VB.NET?
Il n'y a aucune différence si les deux opérandes sont des chaînes. Cependant, si un opérande est une chaîne et un est un nombre, vous rencontrez des problèmes, consultez le code ci-dessous.
"abc" + "def" = "abcdef"
"abc" & "def" = "abcdef"
"111" + "222" = "111222"
"111" & "222" = "111222"
"111" & 222 = "111222"
"111" + 222 = 333
"abc" + 222 = conversion error
Par conséquent, je recommande de toujours utiliser &
lorsque vous voulez concaténer, car vous essayez peut-être de concaténer un entier, flottant, décimal en une chaîne, ce qui provoquera une exception, ou au mieux, ne fera pas ce que vous voulez probablement qu'il fasse.
L'opérateur & s'assure toujours que les deux opérandes sont des chaînes, tandis que l'opérateur + trouve la surcharge qui correspond aux opérandes.
L'expression 1 & 2
donne la valeur "12", tandis que l'expression 1 + 2 donne la valeur 3.
Si les deux opérandes sont des chaînes, il n'y a aucune différence dans le résultat.
Aucun.
Comme vous pouvez le voir ci-dessous. Ces deux lignes de code se compilent exactement dans le même code IL:
Module Module1
Sub Main()
Dim s1 As String = "s1"
Dim s2 As String = "s2"
s2 += s1
s1 &= s2
End Sub
End Module
Compile vers (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
L'opérateur + peut être soit l'addition, soit la concaténation. Le & n'est qu'une concaténation. Si les expressions sont les deux chaînes, les résultats seraient les mêmes.
J'utilise & lorsque je travaille avec des chaînes et + lorsque je travaille avec des nombres, il n'y a donc jamais de confusion quant à mon intention. Si vous utilisez par erreur + et une expression est une chaîne et une est un nombre, vous courez le risque de résultats indésirables.
Il n'y a pas de différence dans la plupart des cas. Cependant, la meilleure pratique est:
"+" doit être réservé pour ajouts entiers, car si vous n'utilisez pas Option Strict On , alors vous pourriez ont vraiment gâché des situations telles que:
Input + 12
pourrait vous donner 20
au lieu de 812
. Cela peut être particulièrement mauvais dans une application ASP.NET où l'entrée provient de POST/GET.
Autrement dit: Pour joindre des chaînes, utilisez toujours "&" au lieu de "+".
Évidemment, utilisez StringBuilder où cela convient:)
Si les deux types sont statiquement tapés à System.String , il n'y a aucune différence entre le code. Les deux se résoudront au membre String.Concat (c'est ce que +
fait pour les chaînes).
Cependant, si les objets ne sont pas fortement typés en chaîne, la liaison tardive Visual Basic démarrera et suivra deux itinéraires très différents. Le +
la version tentera d'effectuer une opération d'ajout qui tentera littéralement d'ajouter les objets. Cela fera toutes sortes de tentatives pour convertir les deux valeurs en un nombre, puis les ajoutera.
Le &
L'opérateur tentera de concaténer. Le runtime Visual Basic passera par toutes sortes de conversions pour convertir les deux valeurs en chaînes. Il faudra alors String.Concat
Les resultats.
Directement à partir de la documentation MSDN: Opérateurs de concaténation en Visual Basic
Différences entre les deux opérateurs de concaténation
L'opérateur + (Visual Basic) a pour principal objectif d'ajouter deux nombres. Cependant, il peut également concaténer des opérandes numériques avec des opérandes de chaîne. L'opérateur + possède un ensemble complexe de règles qui déterminent s'il faut ajouter, concaténer, signaler une erreur de compilation ou lever une exception InvalidCastException au moment de l'exécution.
L'opérateur & (Visual Basic) est défini uniquement pour les opérandes String et il élargit toujours ses opérandes à String, quel que soit le paramètre de l'option Strict. L'opérateur & est recommandé pour la concaténation de chaînes car il est défini exclusivement pour les chaînes et réduit vos chances de générer une conversion involontaire.
Faites confiance à MSDN! :-)
Aucun lors de la jonction de chaînes:
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