System.String und System.Text.StringBuilder
Es ist wichtig zu wissen, dass eine Instanz von
System.String nie modifiziert werden kann. Das heißt, einmal erstellt, kann der enthaltene String nicht mehr geändert werden. Alle Anweisungen, welche den Anschein haben den String zu ändern erstellen im Hintergrund eine neue String-Instanz und liefern diese zurück. Während eine augenscheinlich einfache Anweisung wie:
Foo := Foo + 'Another String';
auf den ersten Blick gut aussieht, so wird man in einer Schleife schnell feststellen, dass dem nicht so ist. Der Grund? Der String
Foo muss mit jeder Änderung neu erstellt werden und das kann sehr langsam sein.
The Lösung ist denkbar einfach, man kann die Klasse
System.Text.StringBuilder nutzen:
Delphi-Quellcode:
var
Attributes: AttributeCollection;
AnAttribute: Attribute;
DefaultEventAttr: DefaultEventAttribute;
MyBuilder: StringBuilder;
begin
{ The above implementation of writing to the text box string is slow
since strings are immutable (can't be changed) }
{ Instead of simply performing string concatenations,
it is more performant to use a StringBuilder class }
Attributes := TypeDescriptor.GetAttributes(Self);
MyBuilder := StringBuilder.Create;
MyBuilder.Append(' -- All Attributes on the Type ---'#13#10);
for AnAttribute in Attributes do
begin
MyBuilder.Append(AnAttribute.ToString);
MyBuilder.Append(#13#10);
end;
TextBox1.Text := MyBuilder.ToString;
end;
Hinweis: In diesem einfachen Beispiel wird man kaum Performanceunterschiede bemerken, aber in einer langen und engen Schleife wird man! Wenn man Zweifel hat, sollte man wahrscheinlich immer auf die Klasse
System.Text.StringBuilder zurückgreifen.