.NET und C# - wir haben einen Datentypen für Zeichenketten das ist der String.
Ein String der durch eine Klasse wiedergespiegelt wird, die intern mit einem char-Array arbeitet und ich denke keine Klasse im .NET Framework hat so viel "mystisches" an sich und wird derart oft verwendet.
Eine beliebte Frage innerhalb von Schulungen ist die Performance beim Verketten von Strings - rein aus der Erfahrung war es mir bereits bekannt, dass die Verkettung mittels StringBuilder zu bevorzugen ist.
Ein String ist ein sogenannter immutable Type (unveränderlich). Das bedeutet jede Änderung an einem String resultiert in einem neuen (!) String.
Betrachtet man also folgenden Code:
string s1 = "Hallo";
string s2 = ".NET"; string s3 = "Welt"; string res = s1 + s2 + s3;
so ergibt sich daraus, dass bei der Instanzierung von s1 - s3 jeweils ein char[] allokiert wird. Bei der Addition muss man nun aber aufpassen, der erste Ausdruck ist hierbei s1+s2 dies resultiert bereits in einen weiteren string, und anschließend die addition mit s3 ergibt nochmal einen (das ist nun res). Somit haben wir hier bereits, 1,2,3,4,5 Strings im Speicher.
Viele behaupten gerne dies kann "natürlich" in vielen Fällen "vernachlässigt" werden. Aber jeder Entwickler sollte mal darüber nachdenken - wäre es viel Aufwand es anders zu schreiben? Ein kleines Beispiel dafür mit einer zeitlichen Auswertung:
Ein string Array:
var strings = new[]{ "Christian", "Giesswein", "ppedv", "C#" };
soll 10 000 miteinander verkettet werden - also ein riesiger String am Ende.
Ich hab nun einfach mal 6 Möglichkeiten verwendet um das ganze zu realisieren:
- Mit einem normalen "+" Operator und einer inneren foreach
- Mit einem normalen "+" Operator und einer inneren for
- Mit der statischen Methode Concat auf dem string Datentyp
- Mit dem StringBuilder
- Mit einem normalen "+" Operator, einer äußeren foreach
- Mit dem Stringbuilder und einer äußeren string.Concat
Wie erwartet gewinnt der Stringbuilder, man sieht auch gut, dass es bereits vonm Laufzeitverhalten eine große Auswirkung hat, wenn man eine Schleife auslagert sofern möglich. Interessant ist natürlich auch die Verwendung von String.Concat da dessen Verwendung sehr einfach in der Schreibweise ist und auch noch sehr gut lesbar, aber performance mäßig deutlich schneller ist.