Étonnamment, ça dépend.
Si vous le faites dans une méthode:
void Foo() {
String one = "1";
String two = "2";
String result = one + two + "34";
Console.Out.WriteLine(result);
}
ensuite, le compilateur semble émettre le code à l'aide d' String.Concat
@Joachim de réponse (+1 pour lui d'ailleurs).
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 littéraux, comme dans la question d'origine:
String result = "1" + "2" + "3" + "4";
ensuite, le compilateur d'optimiser loin de ces +
signes. C'est l'équivalent de:
const String result = "1234";
En outre, le compilateur va supprimer étrangères des expressions constantes, et n'émettent que s'ils sont utilisés ou exposés. 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);
}
Seulement génère une chaîne de caractères - la constante result
(égal à "1234"). one
et two
n'apparaissent pas dans le résultat de l'ILLINOIS.
Gardez à l'esprit qu'il peut y avoir d'autres optimisations lors de l'exécution. Je vais juste par ce qu'IL est produit.
Enfin, en ce qui concerne la formation, les constantes et les littéraux sont internés, mais la valeur qui est internée est la résultante de la valeur de la constante dans l'IL, pas au sens littéral. Cela signifie que vous pouvez obtenir encore moins des objets de chaîne que vous attendez, depuis plusieurs du même défini des constantes ou des littéraux sera effectivement le même objet! Ceci est illustré par le texte suivant:
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 sinon de façon dynamique), vous vous retrouvez avec une chaîne par concaténation. Par exemple, le code suivant crée à 12 cordes instances: 2 constantes de + 10 itérations, chacune aboutissant à une nouvelle Chaîne de caractères exemple:
public class Program
{
static void Main(string[] args)
{
string result = "";
for (int i = 0; i < 10; i++)
result += "a";
Console.ReadKey();
}
}
Mais (aussi, étonnamment), de multiples consécutifs concaténations sont combinées par le compilateur en un seul multi-concaténation de chaîne. Par exemple, ce programme ne produit que 12 des instances de chaîne! C'est parce que "Même si vous utilisez plusieurs + opérateurs dans une déclaration, la chaîne de contenu 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();
}
}