Einzelnen Beitrag anzeigen

Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: [BorCon] Einführung in die .NET Framework Klassen Biblio

  Alt 11. Okt 2004, 15:46
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.
Daniel W.