Étonnamment, cela dépend.
Si vous faites cela dans une méthode:
void Foo() {
String one = "1";
String two = "2";
String result = one + two + "34";
Console.Out.WriteLine(result);
}
puis le compilateur semble émettre le code en utilisant String.Concat
comme @Joachim a répondu (+1 pour lui btw).
Si vous les définissez comme des constantes , par exemple:
const String one = "1";
const String two = "2";
const String result = one + two + "34";
ou comme littéraux , comme dans la question d'origine:
String result = "1" + "2" + "3" + "4";
alors le compilateur optimisera ces +
signes. C'est équivalent à:
const String result = "1234";
De plus, le compilateur supprimera les expressions constantes superflues et ne les émettra que si elles sont utilisées ou exposées. Par exemple, ce programme:
const String one = "1";
const String two = "1";
const String result = one + two + "34";
public static void main(string[] args) {
Console.Out.WriteLine(result);
}
Ne génère qu'une seule chaîne - la constante result
(égale à "1234"). one
et two
n'apparaissent pas dans l'IL résultante.
Gardez à l'esprit qu'il peut y avoir d'autres optimisations lors de l'exécution. Je vais juste par ce que IL est produit.
Enfin, en ce qui concerne l'internement, les constantes et les littéraux sont internés, mais la valeur qui est internée est la valeur constante résultante dans l'IL, pas le littéral. Cela signifie que vous pourriez obtenir encore moins d'objets chaîne que vous ne le pensez, car plusieurs constantes ou littéraux définis de manière identique seront en fait le même objet! Ceci est illustré par ce qui suit:
public class Program
{
private const String one = "1";
private const String two = "2";
private const String RESULT = one + two + "34";
static String MakeIt()
{
return "1" + "2" + "3" + "4";
}
static void Main(string[] args)
{
string result = "1" + "2" + "34";
// Prints "True"
Console.Out.WriteLine(Object.ReferenceEquals(result, MakeIt()));
// Prints "True" also
Console.Out.WriteLine(Object.ReferenceEquals(result, RESULT));
Console.ReadKey();
}
}
Dans le cas où les chaînes sont concaténées dans une boucle (ou autrement dynamiquement), vous vous retrouvez avec une chaîne supplémentaire par concaténation. Par exemple, ce qui suit crée 12 instances de chaîne: 2 constantes + 10 itérations, chacune aboutissant à une nouvelle instance de chaîne:
public class Program
{
static void Main(string[] args)
{
string result = "";
for (int i = 0; i < 10; i++)
result += "a";
Console.ReadKey();
}
}
Mais (aussi étonnamment), plusieurs concaténations consécutives sont combinées par le compilateur en une seule concaténation multi-chaînes. Par exemple, ce programme ne produit également que 12 instances de chaîne! En effet, « même si vous utilisez plusieurs opérateurs + dans une instruction, le contenu de la chaîne n'est copié qu'une seule fois » .
public class Program
{
static void Main(string[] args)
{
string result = "";
for (int i = 0; i < 10; i++)
result += "a" + result;
Console.ReadKey();
}
}