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#.