Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
Schon VBA bietet eine Menge Funktionen für den Umgang mit Zeichenketten. Unter C# – wer hätte das gedacht – setzt Microsoft noch Einiges drauf. Einer der wichtigsten Unterschiede ist, dass eine Variable des Typs String nun nicht mehr einfach nur eine Zeichenkette aufnehmen kann, sondern sogar auf ein Objekt verweist, das den Text enthält und Methoden und Eigenschaften aufweist. Dieser Artikel liefert eine Einführung in den Umgang mit Zeichenketten unter C#.
Unter VBA ist eine Zeichenkette, also der Inhalt einer Variablen mit dem Datentyp String, ein Werttyp – genau wie die Zahlendatentypen oder Datum/Zeit. Unter C# (und den anderen .NET-Programmiersprachen) ist dies anders: Dort ist ein String ein Referenztyp, das heißt, dass die Objektvariable des Datentyps String lediglich die Speicheradresse enthält, hinter der sich der eigentliche Inhalt verbirgt. Außerdem bringt der String unter .NET die Eigenschaften eines Objekts mit, nämlich Methoden und Eigenschaften. Prinzipiell entspricht ein String-Objekt sogar einem Array, das Elemente des Datentyps Char enthält – der wiederum ein Werttyp ist.
Beispiele nachbauen
Wenn Sie die Beispiele dieses Artikels nachvollziehen möchten, legen Sie ein Projekt des Typs Konsolenanwendung mit der Programmiersprache Visual C# an. Die nachfolgenden Beispiele können Sie dann als Inhalt der Prozedur Main eintragen und mit F5 ausführen.
Variable deklarieren und füllen
Für ein einfaches Beispiel, das einfach nur eine Variable des Typs String mit dem Namen zeichenfolge erstellt, mit einer Zeichenkette füllt und auf der Konsole ausgibt, sieht dies wie folgt aus:
namespace Zeichenketten { class Program { static void Main(string[] args) { String zeichenfolge = "Beispieltext"; Console.WriteLine(zeichenfolge); Console.ReadLine(); } } }
Die Anweisung zum Deklarieren und Füllen der Variablen können Sie, wie üblich, auch auf zwei Anweisungen aufteilen:
String zeichenfolge; zeichenfolge = "Beispieltext";
Ein String ist ein Array
Eingangs haben wir die Behauptung aufgestellt, dass ein String-Objekt Eigenschaften eines Array aufweisen würde. Dabei handelt es sich beispielsweise um die Möglichkeit, per Index auf die einzelnen Elemente des Typs Char zuzugreifen oder diese sogar per foreach-Schleife zu durchlaufen. Um diese Erkenntnis zu gewinnen, gibt es zwei Möglichkeiten: Die erste ist es, sich einfach per IntelliSense die Eigenschaften und Methoden des String-Objekts anzeigen zu lassen. Oder Sie öffnen mit Strg + Alt + J den Objektkatalog und suchen dort nach der Zeichenkette String, was unter System.String schnell den richtigen Treffer liefert (siehe Bild 1).
Bild 1: Ausgabe zweier Write-Anweisungen
Buchstaben per foreach-Schleife durchlaufen
Wenn Sie sich die Basistypen des String-Objekts ansehen, stoßen Sie schnell auf die IEnumerable-Schnittstelle. Ist diese vorhanden, können Sie die Elemente eines Objekts per foreach-Schleife durchlaufen.
Dies erledigen wir im folgenden Beispiel, wo wir eine for-each-Schleife über alle Char-Elemente des String-Objekts zeichenfolge durchlaufen und das jeweilige Char-Element mit der Variablen buchstabe referenzieren. Innerhalb der Schleife geben wir den Inhalt der Char-Variablen buchstabe zweimal aus – einmal unbehandelt und einmal zu einem Integer-Wert konvertiert:
String zeichenfolge = "Beispieltext"; foreach(Char buchstabe in zeichenfolge) { Console.WriteLine("{0} {1}", buchstabe, (int)buchstabe); } Console.ReadLine();
Das Ergebnis sieht wie in Bild 2 aus – neben dem Buchstaben erscheint der ASCII-Wert entsprechend der UTF-16-Kodierung für das jeweilige Zeichen.
Bild 2: Ausgabe der Char-Elemente eines String-Objekts als Text und Integer
Statt int hätten wir hier auch den Datentyp byte verwenden können:
(byte)buchstabe
Zeichenkette mit for durchlaufen
Das folgende Beispiel zeigt, wie Sie die Anzahl der enthaltenen Zeichen in einer String-Variablen ermitteln. Mit diesem Wert können wir dann eine for-Schleife definieren, die mit jedem Durchlauf das aktuelle Char-Element über den Index der String-Variablen zeichenfolge ermittelt und der Variablen buchstabe zuweist.
Auch hier landen der Buchstabe und der ASCII-Code in der Ausgabe:
String zeichenfolge = "Beispieltext"; int anzahl = zeichenfolge.Length; for (int i = 0; i < anzahl; i++) { Char buchstabe = zeichenfolge[i]; Console.WriteLine("{0} {1}", buchstabe, (int)buchstabe); } Console.ReadLine();
Dies ist schon einmal erheblich einfacher als unter VBA – dort hätten Sie erstens nur eine For…Next-Schleife verwenden können, um auf die einzelnen Zeichen zuzugreifen, und zweitens hätten wir für jeden einzelnen Zugriff die Mid-Funktion auf die Zeichenkette anwenden müssen:
For i = 0 To Len(strZeichenkette) Debug.Print Mid(strZeichenkette, i, 1) Next i
Zur Ermittlung des ASCII-Codes hätten wir dort noch die Funktion Asc verwenden müssen, statt einfach nur den Buchstaben in den Zahlentyp int oder byte zu konvertieren.
Übrigens können Sie auch einfach über den Index auf ein Zeichen eines String-Objekts zugreifen – beispielsweise wie folgt auf das erste Zeichen:
string Vorname = "André"; char Buchstabe = Vorname[0];
Unterschied zwischen String und Char
Es gibt eine Reihe Unterschiede zwischen string– und char-Objekten. Einen haben Sie schon kennen gelernt: Ein Char ist ein Element eines Arrays, das in einer string-Variablen gespeichert wird. Ein anderer ist, dass nicht beide etwa beim Zuweisen in Anführungszeichen eingefasst werden.
Beim string verwenden Sie das übliche Anführungszeichen:
string zeichenfolge; zeichenfolge = "Beispieltext";
Bei einer Char-Variable, die ja nur ein Zeichen aufnehmen kann, verwenden Sie hingegen einfache Anführungszeichen: