Sara' il caldo ma oggi mi e' venuto un dubbio sulla concatenazione delle stringhe...
E' piu' giusto usare il "+" oppure "&" per concatenare le stringhe?
Nel dubbio ho dato un occhiata al codice IL generato da questo esempio:
Sub Main()
Dim s As String
Dim s2 As String
Dim s3 As String
Dim s4 As String
s = "Ciao"
s = s + "ok"
s2 = "Hello"
s2 = s2 & "world"
s3 = s + s2
s4 = s & s2
End Sub
Il risultato e':
.method public static void Main() cil managed
{
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// Code size 55 (0x37)
.maxstack 2
.locals init ([0] string s,
[1] string s2,
[2] string s3,
[3] string s4)
IL_0000: nop
IL_0001: ldstr "Ciao"
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: ldstr "ok"
IL_000d: call string [mscorlib]System.String::Concat(string,
string)
IL_0012: stloc.0
IL_0013: ldstr "Hello"
IL_0018: stloc.1
IL_0019: ldloc.1
IL_001a: ldstr "world"
IL_001f: call string [mscorlib]System.String::Concat(string,
string)
IL_0024: stloc.1
IL_0025: ldloc.0
IL_0026: ldloc.1
IL_0027: call string [mscorlib]System.String::Concat(string,
string)
IL_002c: stloc.2
IL_002d: ldloc.0
IL_002e: ldloc.1
IL_002f: call string [mscorlib]System.String::Concat(string,
string)
IL_0034: stloc.3
IL_0035: nop
IL_0036: ret
} // end of method Module1::Main
Identico!, ma allora perche' usare "&" al posto di "+"?
Vecchi ricordi di VB6?, no in realta MSDN spiega la differenza:
+ Operator
Adds two numbers. Also used to concatenate two strings.
expression1 + expression2
Parts
expression1
Required. Any numeric expression or string.
expression2
Required. Any numeric expression or string.
& Operator
Generates a string concatenation of two expressions.
result = expression1 & expression2
Parts
result
Required. Any String or Object variable.
expression1
Required. Any expression with a data type that widens to String.
expression2
Required. Any expression with a data type that widens to String.
Questo significa che + concatenera' l'espressione _solo_ se entrambi sono delle stringhe, & si occupera' di convertire l'espressione in una stringa e poi effettuera' la concatenazione.
Infatti, questo codice:
Sub Main()
Dim s As String = "Ciao-"
Dim s2 As String
s2 = s & 12 '// s + 12
End Sub
Compila tranquillamente infatti ecco il codice IL
IL_0000: nop
IL_0001: ldstr "Ciao-"
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: ldc.i4.s 12
IL_000a: call string [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.StringType::FromInteger(int32)
IL_000f: call string [mscorlib]System.String::Concat(string,
string)
IL_0014: stloc.1
IL_0015: nop
IL_0016: ret
Mentre sostituendo s2 = s & 12 con s2=s+12 ho giustamente un errore di cast.
Conclusione:
Da oggi utilizzero' sempre "+" per concatenare le stringhe, cosi' mi uniformero' anche con il codice C#.