Gewusst wie: Verketten von mehreren Zeichenfolgen (C#-Programmierhandbuch)
Verkettung ist der Prozess, eine Zeichenfolge ans Ende einer anderen Zeichenfolge anzufügen. Wenn Sie Zeichenfolgenliterale oder –konstanten mit dem Operator + verketten, erstellt der Compiler eine einzelne Zeichenfolge. Es tritt keine Laufzeitverkettung auf. Zeichenfolgenvariablen können jedoch nur zur Laufzeit verkettet werden. In diesem Fall sollten Sie die Leistungsauswirkungen der verschiedenen Ansätze kennen.
Beispiel
Im folgenden Beispiel wird dargestellt, wie ein langes Zeichenfolgenliteral in kleinere Zeichenfolgen aufgeteilt werden kann, um die Lesbarkeit im Quellcode zu verbessern. Diese Teile werden zur Kompilierzeit in eine einzelne Zeichenfolge verkettet. Es entstehen unabhängig von der Anzahl an Zeichenfolgen keine Laufzeitleistungseinbußen.
static void Main()
{
// Concatenation of literals is performed at compile time, not run time.
string text = "Historically, the world of data and the world of objects " +
"have not been well integrated. Programmers work in C# or Visual Basic " +
"and also in SQL or XQuery. On the one side are concepts such as classes, " +
"objects, fields, inheritance, and .NET Framework APIs. On the other side " +
"are tables, columns, rows, nodes, and separate languages for dealing with " +
"them. Data types often require translation between the two worlds; there are " +
"different standard functions. Because the object world has no notion of query, a " +
"query can only be represented as a string without compile-time type checking or " +
"IntelliSense support in the IDE. Transferring data from SQL tables or XML trees to " +
"objects in memory is often tedious and error-prone.";
Console.WriteLine(text);
}
Um Zeichenfolgenvariablen zu verketten, können Sie den Operator + bzw. += oder die Methode String.Concat, String.Format bzw. StringBuilder.Append verwenden. Der +-Operator ist einfach zu verwenden und gut für intuitiv verständlichen Code geeignet. Auch wenn Sie mehrere +-Operatoren in einer Anweisung verwenden, wird der Inhalt der Zeichenfolge nur einmal kopiert. Wenn Sie diesen Vorgang jedoch mehrfach wiederholen, z. B. in einer Schleife, kann dies Effizienzprobleme verursachen. Beachten Sie z. B. folgenden Code:
static void Main(string[] args)
{
// To run this program, provide a command line string.
// In Visual Studio, see Project > Properties > Debug.
string userName = args[0];
string date = DateTime.Today.ToShortDateString();
// Use the + and += operators for one-time concatenations.
string str = "Hello " + userName + ". Today is " + date + ".";
System.Console.WriteLine(str);
str += " How are you today?";
System.Console.WriteLine(str);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
// Example output:
// Hello Alexander. Today is 1/22/2008.
// Hello Alexander. Today is 1/22/2008. How are you today?
// Press any key to exit.
//
Hinweis
Bei der Zeichenfolgenverkettung behandelt der C#-Compiler eine NULL-Zeichenfolge wie eine leere Zeichenfolge, konvertiert jedoch nicht den Wert der ursprünglichen NULL-Zeichenfolge.
Falls Sie keine große Anzahl an Zeichenfolgen (z. B. in einer Schleife) verketten, fallen die Leistungseinbußen dieses Codes wahrscheinlich nicht ins Gewicht. Entsprechendes gilt für die String.Concat-Methode bzw. die String.Format-Methode.
Wenn jedoch die Leistung eine wichtige Rolle spielt, sollten Sie immer die StringBuilder-Klasse zum Verketten von Zeichenfolgen verwenden. Im folgenden Code werden mit der Append-Methode der StringBuilder-Klasse Zeichenfolgen ohne den Verkettungseffekt des Operators + miteinander verkettet.
class StringBuilderTest
{
static void Main()
{
string text = null;
// Use StringBuilder for concatenation in tight loops.
System.Text.StringBuilder sb = new System.Text.StringBuilder();
for (int i = 0; i < 100; i++)
{
sb.AppendLine(i.ToString());
}
System.Console.WriteLine(sb.ToString());
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
}
// Output:
// 0
// 1
// 2
// 3
// 4
// ...
//