Bonjour,

Suite à une étude sur les meilleurs pratiques autour des chaines de caractères, j'en ai conclu que l'opérateur "+" était une très bonne chose. A savoir :
  • Les litteraux sont concaténés à la compilation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string s1 = "Cette Chaine sera concaténée " +
                "lors de la compilation. L'utilisation " +
                "du \"+\" augmente la lisibilité.";
  • Les autres concatenations sont remplacées par un String.Concat qui est très performant. Ce qui signifie que ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    string s1 = "Toutes les ";
    string s2 = "chaines sont ";
    string s3 = "connues avant ";
    string s4 = "l'operation de ";
    string s5 = "concatenation ";
    string s6 = s1 + s2 + s3 + s4 + s5 ;
    génère exactement le même MSIL que le code suivant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    string s1 = "Toutes les ";
    string s2 = "chaines sont ";
    string s3 = "connues avant ";
    string s4 = "l'operation de ";
    string s5 = "concatenation ";
    string s6 = String.Concat(s1, s2, s3, s4, s5);
    a savoir, génération d'un tableau de string (car au dela de 4 arguments String.Concat passe par un tableau), puis appel a String.Concat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    IL_0187:  ldc.i4.5
    IL_0188:  newarr     [mscorlib]System.String
    IL_018d:  stloc.s    CS$0$0000
    IL_018f:  ldloc.s    CS$0$0000
    IL_0191:  ldc.i4.0
    IL_0192:  ldloc.s    s1
    IL_0194:  stelem.ref
    IL_0195:  ldloc.s    CS$0$0000
    IL_0197:  ldc.i4.1
    IL_0198:  ldloc.s    s2
    IL_019a:  stelem.ref
    IL_019b:  ldloc.s    CS$0$0000
    IL_019d:  ldc.i4.2
    IL_019e:  ldloc.s    s3
    IL_01a0:  stelem.ref
    IL_01a1:  ldloc.s    CS$0$0000
    IL_01a3:  ldc.i4.3
    IL_01a4:  ldloc.s    s4
    IL_01a6:  stelem.ref
    IL_01a7:  ldloc.s    CS$0$0000
    IL_01a9:  ldc.i4.4
    IL_01aa:  ldloc.s    s5
    IL_01ac:  stelem.ref
    IL_01ad:  ldloc.s    CS$0$0000
    IL_01af:  call       string [mscorlib]System.String::Concat(string[])


De plus, String.Concat (donc l'operateur "+" également) s'execute deux fois plus rapidement qu'un String.Format ou qu'un StringBuilder, et utilise également deux fois moins de mémoire que ces deux instructions (PerfView).

En ce qui me concerne l'histoire devrait s'arretter la : l'operateur "+" n'est pas contre-indiqué, voir même mieux que les autres. Mais il parrait que Mr Microsoft déconseille son utilisation, et que Mr Resharper le remplace par String.Format() parce qu'il serait le saint graal de la performance .
Donc si un expert pouvait, soit, confirmer mes observations, soit, expliquer où je me trompe, ce serait super sympa.