Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort zur 6. Auflage
1 Allgemeine Einführung in .NET
2 Grundlagen der Sprache C#
3 Das Klassendesign
4 Vererbung, Polymorphie und Interfaces
5 Delegates und Ereignisse
6 Strukturen und Enumerationen
7 Fehlerbehandlung und Debugging
8 Auflistungsklassen (Collections)
9 Generics – Generische Datentypen
10 Weitere C#-Sprachfeatures
11 LINQ
12 Arbeiten mit Dateien und Streams
13 Binäre Serialisierung
14 XML
15 Multithreading und die Task Parallel Library (TPL)
16 Einige wichtige .NET-Klassen
17 Projektmanagement und Visual Studio 2012
18 Einführung in die WPF und XAML
19 WPF-Layout-Container
20 Fenster in der WPF
21 WPF-Steuerelemente
22 Elementbindungen
23 Konzepte von WPF
24 Datenbindung
25 Weitere Möglichkeiten der Datenbindung
26 Dependency Properties
27 Ereignisse in der WPF
28 WPF-Commands
29 Benutzerdefinierte Controls
30 2D-Grafik
31 ADO.NET – Verbindungsorientierte Objekte
32 ADO.NET – Das Command-Objekt
33 ADO.NET – Der SqlDataAdapter
34 ADO.NET – Daten im lokalen Speicher
35 ADO.NET – Aktualisieren der Datenbank
36 Stark typisierte DataSets
37 Einführung in das ADO.NET Entity Framework
38 Datenabfragen des Entity Data Models (EDM)
39 Entitätsaktualisierung und Zustandsverwaltung
40 Konflikte behandeln
41 Plain Old CLR Objects (POCOs)
Stichwort

Download:
- Beispiele, ca. 62,4 MB

Buch bestellen
Ihre Meinung?

Spacer
Visual C# 2012 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual C# 2012

Visual C# 2012
Rheinwerk Computing
1402 S., 6., aktualisierte und erweiterte Auflage 2013, geb., mit DVD
49,90 Euro, ISBN 978-3-8362-1997-6
Pfeil 16 Einige wichtige .NET-Klassen
Pfeil 16.1 Die Klasse »Object«
Pfeil 16.1.1 Referenzvergleiche mit »Equals« und »ReferenceEquals«
Pfeil 16.1.2 »ToString« und »GetType«
Pfeil 16.1.3 Die Methode »MemberwiseClone« und das Problem des Klonens
Pfeil 16.2 Die Klasse »String«
Pfeil 16.2.1 Das Erzeugen eines Strings
Pfeil 16.2.2 Die Eigenschaften von »String«
Pfeil 16.2.3 Die Methoden der Klasse »String«
Pfeil 16.2.4 Zusammenfassung der Klasse »String«
Pfeil 16.3 Die Klasse »StringBuilder«
Pfeil 16.3.1 Allgemeines
Pfeil 16.3.2 Die Kapazität eines »StringBuilder«-Objekts
Pfeil 16.3.3 Die Konstruktoren der Klasse »StringBuilder«
Pfeil 16.3.4 Die Eigenschaften der Klasse »StringBuilder«
Pfeil 16.3.5 Die Methoden der Klasse »StringBuilder«
Pfeil 16.3.6 Allgemeine Anmerkungen
Pfeil 16.4 Der Typ »DateTime«
Pfeil 16.4.1 Die Zeitspanne »Tick«
Pfeil 16.4.2 Die Konstruktoren von »DateTime«
Pfeil 16.4.3 Die Eigenschaften von »DateTime«
Pfeil 16.4.4 Die Methoden der Klasse »DateTime«
Pfeil 16.5 Die Klasse »TimeSpan«
Pfeil 16.6 Ausgabeformatierung
Pfeil 16.6.1 Formatierung mit der Methode »String.Format«
Pfeil 16.6.2 Formatierung mit der Methode »ToString«
Pfeil 16.6.3 Benutzerdefinierte Formatierung

Galileo Computing - Zum Seitenanfang

16.3 Die Klasse »StringBuilder«Zur nächsten Überschrift


Galileo Computing - Zum Seitenanfang

16.3.1 AllgemeinesZur nächsten ÜberschriftZur vorigen Überschrift

Objekte der Klasse String sind unveränderlich, d. h., dass bei jeder Änderung im Speicher ein neues Objekt angelegt wird. Das ist sogar unabhängig davon, ob sich die Länge der Zeichenkette ändert. Führen Sie viele manipulierende Operationen aus, hat das Einbußen der Systemleistung zur Folge.

Um sich einen Eindruck davon zu verschaffen, wie sehr die Effizienz bei vielen String-Operationen beeinträchtigt wird, sollten wir einen sehr einfachen Test machen. Dazu lassen wir in einer Schleife 50.000 Änderungen an einer Zeichenfolge vornehmen. Folgerichtig müssen auch ebenso viele neue Objekte erzeugt und, bis auf das letzte, freigegeben werden. Messen lässt sich die verstrichene Zeit mit einem Objekt vom Typ Stopwatch. Mit der Methode Start wird die Zeitmessung gestartet, mit Stop beendet. Die Zeit in Millisekunden zwischen den beiden Methodenaufrufen liefert die Eigenschaft ElapsedMilliseconds. Sie sollten nicht vergessen, den Namespace System.Diagnostics mit using bekannt zu geben, in dem die Klasse Stopwatch definiert ist.

// Beispiel: ..\Kapitel 16\String_Leistungstest

using System.Diagnostics;

static void Main(string[] args) {
Stopwatch watch = new Stopwatch();
string text = "";
watch.Start();
for (int i = 0; i < 50000; i++)
text += "x";
watch.Stop();
Console.WriteLine("Zeit: {0}", watch.ElapsedMilliseconds);
Console.ReadLine();
}

Listing 16.19 Zeitmessung einer Zeichenfolgenoperation (String)

Probieren Sie das Listing einmal aus! Auch auf einem gut ausgestatteten Rechner werden die Operationen eine längere Zeitspanne beanspruchen, bis das Ergebnis vorliegt. Mein derzeitiger Rechner gibt mir Werte im Bereich von 700 ms aus.

Das ist natürlich unvertretbar lang, ganz abgesehen davon, dass der Speicher massiv belastet wird. Einen Ausweg aus diesem Dilemma bietet die Klasse StringBuilder, die zum Namespace System.Text gehört. StringBuilder-Objekte sind dynamisch. Sie können verändert werden, ohne dass damit zwangsläufig Allokieren von Speicher erforderlich wird. Natürlich interessiert uns auch der Performancegewinn. Daher schreiben wir das Codefragment von oben so um, dass anstelle des Typs String die Klasse StringBuilder eingesetzt wird:

// Beispiel: ..\Kapitel 16\StringBuilder_Leistungstest

using System.Diagnostics;

static void Main(string[] args) {
Stopwatch watch = new Stopwatch();
StringBuilder str = new StringBuilder();
watch.Start();
for (int i = 0; i < 50000; i++)
str = str.Append("x");
watch.Stop();
Console.WriteLine("Zeit: {0}", watch.ElapsedMilliseconds);
Console.ReadLine();
}

Listing 16.20 Zeitmessung einer Zeichenfolgenoperation (StringBuilder)

Auf meinem Rechner wird ein Wert angezeigt, der bei 1 ms liegt. Der Leistungsgewinn ist also mehr als deutlich und beweist, welchem Typ der Vorzug gegeben werden sollte: eindeutig dem StringBuilder.


Galileo Computing - Zum Seitenanfang

16.3.2 Die Kapazität eines »StringBuilder«-ObjektsZur nächsten ÜberschriftZur vorigen Überschrift

Sie müssen zwei Begriffe sorgfältig trennen, wenn Sie die Arbeitsweise des StringBuilders verstehen wollen: die Kapazität und die Länge der beschriebenen Zeichenfolge. Die Kapazität beschreibt die maximale Anzahl der Zeichen, die ein StringBuilder-Objekt aufnehmen kann. Die Kapazität wird somit immer größer sein als die Länge der Zeichenfolge, aber nicht umgekehrt.

Nehmen wir dazu ein Beispiel. Wir erzeugen mit einem der Konstruktoren ein StringBuilder-Objekt und weisen ihm die Zeichenfolge »Visual C#« zu:

using System.Text;
[...]
StringBuilder strB = new StringBuilder("Visual C#");

Die Zeichenfolge ist neun Zeichen lang. Da wir keine explizite Aussage über die Kapazität getroffen haben, wird ein Objekt von der Größe der Standardkapazität erzeugt – und die beträgt 16 Zeichen. Weisen Sie dem StringBuilder-Objekt eine Zeichenkette zu, die mehr als 16 Zeichen, jedoch weniger als 33 Zeichen umfasst, wird die Kapazität auf 32 Zeichen festgelegt. Beträgt die Länge des Strings mehr als 32 Zeichen, jedoch weniger als 65, verdoppelt sich die Kapazität von 32 auf 64 Zeichen usw.

Werden Methoden auf dieses Objekt angewendet, die zur Folge haben, dass die Kapazitätsgrenze nicht überschritten wird, wird kein neuer Speicher allokiert. Die Änderungen laufen innerhalb der alten Speicherressourcen ab. Sollten bei einer Änderung jedoch die Kapazitätsgrenzen überschritten werden, wird die Kapazität des StringBuilder-Objekts automatisch vergrößert.


Galileo Computing - Zum Seitenanfang

16.3.3 Die Konstruktoren der Klasse »StringBuilder«Zur nächsten ÜberschriftZur vorigen Überschrift

Vornehmlich geht es bei den Konstruktoren darum, dem StringBuilder-Objekt eine Initialisierungszeichenfolge zuzuweisen und die Anfangskapazität festzulegen.

public StringBuilder();

public StringBuilder(int);

public StringBuilder(string);

public StringBuilder(string, int);

Bei der Festlegung der Kapazität im Parameter vom Typ int müssen Sie sich nicht an die Sprünge 16, 32, 64, 128 usw. halten, die das StringBuilder-Objekt im Bedarfsfall automatisch durchführt. Theoretisch kann eine Zeichenfolge die Größe von 231–1 Zeichen aufnehmen. Um diesem nahezu endlosen Spiel einen Riegel vorzuschieben, bietet sich ein weiterer Konstruktor an, mit dem Sie die maximale Kapazitätsgrenze festlegen können:

public StringBuilder(int, int);

Der erste Parameter erwartet die Startkapazität, der zweite die zulässige Maximalgröße. Wird diese zur Laufzeit überschritten, wird die Ausnahme ArgumentOutOfRangeException ausgelöst.


Galileo Computing - Zum Seitenanfang

16.3.4 Die Eigenschaften der Klasse »StringBuilder«Zur nächsten ÜberschriftZur vorigen Überschrift

Die Liste der Eigenschaften umfasst nur insgesamt vier Mitglieder. Mit Capacity können Sie die aktuelle Kapazität abfragen oder neu festlegen. Verwechseln Sie Capacity nicht mit der Eigenschaft Length, die die Anzahl der Zeichen der vom Objekt repräsentierten Zeichenfolge wiedergibt. MaxCapacity beschreibt die maximale Kapazität. Diese Eigenschaft ist schreibgeschützt und kann daher nur gelesen werden. Nur über die Konstruktoren sind Sie in der Lage, Einfluss darauf auszuüben. Wird MaxCapacity nicht festgelegt, gibt diese Eigenschaft die theoretische Maximalkapazität von 231–1 zurück.

Die vierte und letzte Eigenschaft lautet Chars und ist gleichzeitig der Indexer der StringBuilder-Klasse:

public char this[int] {get; set;}

Chars liefert ein Zeichen aus der gegebenen Zeichenfolge zurück, dessen Index übergeben wird. Um sich aus der Zeichenfolge

StringBuilder builder = new StringBuilder("Freitagabend");

den fünften Buchstaben zurückgeben zu lassen, lautet die Anweisung:

char c = builder[4];

Tabelle 16.6 Die Eigenschaften der Klasse »StringBuilder«

Eigenschaft Methode

Capacity

Liefert oder setzt die Kapazität des StringBuilder-Objekts.

Chars

Liefert das Zeichen an einer genau spezifizierten Position aus der Zeichenfolge. Diese Eigenschaft ist der Indexer der Klasse.

Length

Liefert die Länge der Zeichenfolge.

MaxCapacity

Liefert die Maximalkapazität des StringBuilder-Objekts.


Galileo Computing - Zum Seitenanfang

16.3.5 Die Methoden der Klasse »StringBuilder«Zur nächsten ÜberschriftZur vorigen Überschrift

Wenn Sie sich zum ersten Mal die Liste der Methoden anschauen, werden Sie erstaunt sein, dass entgegen aller Erwartungen kaum mehr als eine Handvoll Operationen angeboten wird. Diese wollen wir uns nun ansehen.

Tabelle 16.7 Methoden der Klasse »StringBuilder«

Methode Eigenschaft

Append

Hängt eine Zeichenfolge an eine bestehende StringBuilder-Instanz an.

AppendFormat

Fügt der StringBuilder-Instanz eine Zeichenfolge mit Formatangaben an. Nähere Informationen zur Formatierung finden Sie in Abschnitt 16.6.

AppendLine

Eine Zeile hinzufügen

CopyTo

Kopiert einen Teil des Objekts in ein char-Array.

EnsureCapacity

Stellt sicher, dass die Kapazität des StringBuilder-Objekts mindestens so groß wie angegeben ist.

Insert

Fügt an einer spezifizierten Position eine Zeichenfolge ein.

Remove

Löscht aus einer Zeichenfolge ab einer bestimmten Position eine Zeichensequenz.

Replace

Ersetzt in der gesamten Zeichenfolge ein Zeichen durch ein anderes.

Eine Zeichenkette einem »StringBuilder«-Objekt zuweisen

Soll einem StringBuilder-Objekt eine Zeichenfolge zugewiesen werden, kommt die Methode Append zum Einsatz, der aufgrund der vielen Überladungen praktisch jeder Datentyp übergeben werden kann:

public StringBuilder Append(string);

public StringBuilder Append(int);

public StringBuilder Append(byte);

...

In den meisten Fällen wird dies vermutlich eine Zeichenfolge sein, z. B.:

builder = builder.Append("Visual Studio");

Der Rückgabewert der Append-Methode ist die Referenz auf ein Objekt vom Typ StringBuilder, das die entsprechende Zeichenfolge enthält. Sie müssen Append auch aufrufen, wenn eine Referenz auf ein Objekt vom Typ StringBuilder vorliegt, das noch nicht initialisiert ist. Wenn Sie Append mehrfach hintereinander anwenden, wird bei jedem Aufruf der Methode eine weitere Zeichenfolge hinter der bestehenden angehängt. Das entspricht dem +-Operator auf String-Objekte.

Halten Sie sich immer vor Augen, dass ein StringBuilder-Objekt keine Zeichenfolge repräsentiert – dafür dient der Datentyp string. Wollen Sie sich den Inhalt eines StringBuilder-Objekts von einer Methode ausgeben lassen, die den Datentyp string als Übergabeparameter erwartet, müssen Sie deshalb mit der Methode ToString das StringBuilder-Objekt in einen string konvertieren.

StringBuilder builder = new StringBuilder();
builder.Append("Hello again");
Console.WriteLine(builder.ToString());

Listing 16.21 »StringBuilder«-Objekt als Zeichenfolge ausgeben

Eine Zeichenfolge mit »Insert« einfügen

Um an einer spezifizierten Position in einer Zeichenfolge eine zusätzliche Zeichenfolge einzufügen, rufen Sie die Insert-Methode auf. Diese ist in gleicher Weise wie Append überladen, allerdings ist die Parameterliste jeweils um einen Parameter vom Typ int ergänzt, der dem Index übergeben wird, ab dem die Zeichenfolge eingefügt werden soll.

StringBuilder builder = new StringBuilder();
builder = builder.Append("fällt Schnee");
builder = builder.Insert(0, "Im Winter ");

Listing 16.22 Einfügen einer Zeichenfolge mit »Insert«

Die Ausgabe dieses Codefragments lautet:

Im Winter fällt Schnee

Aus einer Zeichenfolge löschen

Während mit Insert eine Zeichenfolge eingefügt wird, kann mit Remove ab einer bestimmten Position eine bestimmte Anzahl von Zeichen gelöscht werden.

builder.Remove(3, 2);

Mit dem ersten Parameter wird der Index beschrieben, bei dem der Löschvorgang beginnen soll. In unserem Beispiel beginnt er mit dem vierten Zeichen. Über den zweiten Parameter teilen wir die Anzahl der zu löschenden Zeichen mit.

Ein Zeichen oder eine Zeichenfolge ersetzen

Die letzte der von uns behandelten Methoden ist Replace, die im Wesentlichen dieselben Möglichkeiten wie die Replace-Methode der Klasse String bietet.

public StringBuilder Replace(char, char);

public StringBuilder Replace(string, string);

Dem ersten Parameter wird mitgeteilt, welches Zeichen bzw. welche Zeichenfolge des StringBuilder-Objekts ersetzt werden soll, und im zweiten Parameter geben Sie an, wodurch ersetzt wird.

StringBuilder builder = new StringBuilder();
builder.Append("Ich hätte gerne ein Bier");
builder = builder.Replace("ein", "drei");
Console.Write("Meine Bestellung: ");
Console.WriteLine(builder.ToString());

Listing 16.23 Ersetzen einer Teilzeichenfolge mit »Replace«

Sie sehen, mit Replace können Sie es sogar vermeiden, mangels Flüssigkeitszufuhr aufgrund einer unüberlegt aufgegebenen Bestellung zu verdursten.


Galileo Computing - Zum Seitenanfang

16.3.6 Allgemeine AnmerkungenZur vorigen Überschrift

Damit sind aber auch schon die Möglichkeiten der Klasse StringBuilder nahezu ausgeschöpft. Es gibt keine Methoden, die das Auswerten eines Teilstrings ermöglichen, oder Methoden, die Teilstrings zurückliefern. Damit wird auch der doch recht eingeschränkte Einsatzbereich von StringBuilder-Objekten deutlich. Die Klasse String ist in ihren Fähigkeiten weit voraus und lässt mit ihren überladenen Methoden kaum Wünsche offen.

StringBuilder-Objekte werden Ihnen nicht sehr oft begegnen. Die meisten Methoden in der .NET-Klassenbibliothek, die mit Zeichenfolgen operieren, verwenden den Typ string oder Arrays vom Typ char. Am ehesten sind StringBuilder-Objekte dort sinnvoll einzusetzen, wo in einer Schleife bei jedem Schleifendurchlauf eine Operation mit der Zeichenfolge ausgeführt wird. Wenn die Kapazität des StringBuilder-Objekts groß genug festgelegt worden ist, ersparen Sie sich zudem die permanente Neuinstanziierung von string-Objekten und können so einen Beitrag zu einer besseren Performance der Anwendung leisten.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück
  Zum Katalog
Zum Katalog: Visual C# 2012

Visual C# 2012
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Katalog: Windows Presentation Foundation






 Windows Presentation
 Foundation


Zum Katalog: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Katalog: C++ Handbuch






 C++ Handbuch


Zum Katalog: C/C++






 C/C++


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2013
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de