Überraschenderweise kommt es darauf an.
Wenn Sie dies in einer Methode tun:
void Foo() {
String one = "1";
String two = "2";
String result = one + two + "34";
Console.Out.WriteLine(result);
}
dann scheint der Compiler den Code mit der String.Concat
Antwort von @Joachim (+1 an ihn übrigens) auszugeben.
Wenn Sie sie als Konstanten definieren , z.
const String one = "1";
const String two = "2";
const String result = one + two + "34";
oder als Literale , wie in der ursprünglichen Frage:
String result = "1" + "2" + "3" + "4";
dann optimiert der Compiler diese +
Zeichen. Es ist äquivalent zu:
const String result = "1234";
Darüber hinaus entfernt der Compiler überflüssige konstante Ausdrücke und gibt sie nur aus, wenn sie verwendet oder verfügbar gemacht werden. Zum Beispiel dieses Programm:
const String one = "1";
const String two = "1";
const String result = one + two + "34";
public static void main(string[] args) {
Console.Out.WriteLine(result);
}
Erzeugt nur eine Zeichenfolge - die Konstante result
(gleich "1234"). one
und two
erscheinen nicht in der resultierenden IL.
Beachten Sie, dass zur Laufzeit möglicherweise weitere Optimierungen vorgenommen werden. Ich gehe nur nach dem, was IL produziert.
In Bezug auf die Internierung werden schließlich Konstanten und Literale interniert, aber der Wert, der interniert wird, ist der resultierende konstante Wert in der IL, nicht das Literal. Dies bedeutet, dass Sie möglicherweise noch weniger Zeichenfolgenobjekte als erwartet erhalten, da mehrere identisch definierte Konstanten oder Literale tatsächlich dasselbe Objekt sind! Dies wird durch Folgendes veranschaulicht:
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();
}
}
In dem Fall, in dem Zeichenfolgen in einer Schleife (oder auf andere Weise dynamisch) verkettet werden, erhalten Sie eine zusätzliche Zeichenfolge pro Verkettung. Im Folgenden werden beispielsweise 12 Zeichenfolgeninstanzen erstellt: 2 Konstanten + 10 Iterationen, die jeweils zu einer neuen Zeichenfolgeninstanz führen:
public class Program
{
static void Main(string[] args)
{
string result = "";
for (int i = 0; i < 10; i++)
result += "a";
Console.ReadKey();
}
}
Aber (auch überraschend) werden mehrere aufeinanderfolgende Verkettungen vom Compiler zu einer einzigen Verkettung mit mehreren Zeichenfolgen kombiniert. Zum Beispiel erzeugt dieses Programm auch nur 12 String-Instanzen! Dies liegt daran, dass " Selbst wenn Sie mehrere + -Operatoren in einer Anweisung verwenden, der Zeichenfolgeninhalt nur einmal kopiert wird. "
public class Program
{
static void Main(string[] args)
{
string result = "";
for (int i = 0; i < 10; i++)
result += "a" + result;
Console.ReadKey();
}
}