Sorprendentemente, dipende.
Se lo fai con un metodo:
void Foo() {
String one = "1";
String two = "2";
String result = one + two + "34";
Console.Out.WriteLine(result);
}
quindi il compilatore sembra emettere il codice usando String.Concat
come ha risposto @Joachim (+1 a lui btw).
Se li definisci come costanti , ad esempio:
const String one = "1";
const String two = "2";
const String result = one + two + "34";
o come letterali , come nella domanda originale:
String result = "1" + "2" + "3" + "4";
quindi il compilatore ottimizzerà quei +
segni. È equivalente a:
const String result = "1234";
Inoltre, il compilatore rimuoverà le espressioni costanti estranee e le emetterà solo se vengono utilizzate o esposte. Ad esempio, questo programma:
const String one = "1";
const String two = "1";
const String result = one + two + "34";
public static void main(string[] args) {
Console.Out.WriteLine(result);
}
Genera solo una stringa, la costante result
(uguale a "1234"). one
e two
non vengono visualizzati nell'IL risultante.
Tieni presente che potrebbero essere disponibili ulteriori ottimizzazioni in fase di esecuzione. Sto solo seguendo ciò che viene prodotto da IL.
Infine, per quanto riguarda l'interning, le costanti e i letterali sono internati, ma il valore internato è il valore costante risultante nell'IL, non il letterale. Ciò significa che potresti ottenere ancora meno oggetti stringa di quanto ti aspetti, poiché più costanti o valori letterali definiti in modo identico saranno effettivamente lo stesso oggetto! Ciò è illustrato da quanto segue:
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();
}
}
Nel caso in cui le stringhe siano concatenate in un ciclo (o in altro modo dinamicamente), si finisce con una stringa in più per concatenazione. Ad esempio, quanto segue crea 12 istanze di stringa: 2 costanti + 10 iterazioni, ciascuna risultante in una nuova istanza di stringa:
public class Program
{
static void Main(string[] args)
{
string result = "";
for (int i = 0; i < 10; i++)
result += "a";
Console.ReadKey();
}
}
Ma (anche sorprendentemente), più concatenazioni consecutive vengono combinate dal compilatore in una singola concatenazione multi-stringa. Ad esempio, questo programma produce anche solo 12 istanze di stringa! Questo perché " Anche se usi più + operatori in un'istruzione, il contenuto della stringa viene copiato solo una volta. "
public class Program
{
static void Main(string[] args)
{
string result = "";
for (int i = 0; i < 10; i++)
result += "a" + result;
Console.ReadKey();
}
}