Zeichenketten-Konkatenierung in C# 👍 👎

Ein leider immer noch häufig vorzufindendes "Problem" in vielen C#-Anwendungen ist die vielen Entwicklern aus Sprachen wie PHP vertraute Verknüpfung von Zeichenketten per entsprechendem Operator ("." in PHP, "+" in C#):
Konkatenierung per Operator
0102030405
string tmp = "";
tmp += "ersteZeichenkette";tmp += "zweiteZeichenkette";tmp += "dritteZeichenkette";
Dies ist unter C# aus Sicht der Performanz besonders problematisch, da Zeichenketten in C# unveränderbar ("immutable") sind und demnach bei jeder solchen Verknüpfung ein neues Objekt erzeugt wird. Die Lösung für dieses Problem ergibt sich jedoch elegant durch Verwendung der StringBuilder-Klasse:
Konkatenierung per StringBuilder
0102030405060708
StringBuilder tmpBuilder = new StringBuilder();{    tmpBuilder.Append("ersteZeichenkette");    tmpBuilder.Append("zweiteZeichenkette");    tmpBuilder.Append("dritteZeichenkette");}
string tmp = tmpBuilder.ToString();
Dies ist bei C# üblicherweise bereits bei unter drei entsprechenden Vorgängen deutlich schneller als per Operator. Bei sehr vielen – jedoch durchaus praxisrelevanten – Vorgängen wird dieser Unterschied schnell so groß, dass mit der Verknüpfung per StringBuilder bis zu zwei Größenordnungen mehr Vorgänge in der gleichen Zeit wie per Operator möglich sind. Zudem wird selbstverständlich deutlich weniger Arbeitsspeicher benötigt. Insbesondere bei umfangreichen Schleifen ergibt sich hier also sehr schnell ein ernstzunehmendes Einsparpotential. Es handelt sich keinesfalls um "Mikrooptimierung" und wird auch von Microsoft selbst betont.

Bei ganz einfachen Verknüpfungen mit zwei Zeichenketten verwende ich durchaus die Operator-Variante, da sie etwas kompakter ist und der Unterschied minimal. Sobald mehrere Verknüpfungen notwendig werden, setze ich für gewöhnlich jedoch bereits auf einen StringBuilder.

Die intern erzeugte Zeichenkette des StringBuilder kann zur weiteren Verwendung wie im Beispiel ersichtlich jederzeit per ToString() abgerufen werden. Darüber hinaus stellt diese Klasse auch noch ein paar komfortable Methoden wie beispielsweise AppendLine(…) zur Verfügung.


Projektverweise

Kategorien / Archiv  |  Übersicht RSS-Feed

Schlagworte

Suche