System.String hat Dutzende Methoden. Diese Seite behandelt die, die in echtem Code die meiste Arbeit erledigen, mit den Optionen und Fallen, die zählen. Eine Regel gilt für alle: Strings sind unveränderlich, jede Methode gibt also einen neuen String (oder einen Wert) zurück und lässt das Original unverändert. s.Trim(); allein in einer Zeile bewirkt nichts; schreibe s = s.Trim();.
Split
Split zerlegt einen String an jedem Trennzeichen in ein string[]:
Ausgabe:
3
apple
banana
cherry
red/green/ blue/yellow
INFO/started/ready
Beachte " blue": Split schneidet genau am Trennzeichen und behält alle Leerzeichen. Zwei Optionen erledigen das übliche Aufräumen:
Ausgabe:
5
4
c#|dotnet|linq
key=[Subject] value=[Re: Meeting: Friday]
3
RemoveEmptyEntries verwirft Teile der Länge null, aber keine Teile, die nur aus Leerzeichen bestehen (" " hat oben überlebt). .NET 5 hat StringSplitOptions.TrimEntries hinzugefügt, und beide lassen sich kombinieren: tags.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) liefert das saubere Ergebnis in einem Aufruf. Übergibst du null als Trennzeichen, wird an jedem Leerraum geteilt, der übliche Weg, Text in Wörter zu zerlegen.
Das Teilen an einem einzelnen char (Split(',')) braucht kein Array. Die Überladungen, die ein char plus Optionen oder einen einzelnen string nehmen, gibt es ab .NET Core 2.0; die oben verwendeten Array-Formen funktionieren überall, auch unter .NET Framework und in Unity.
Replace
Replace ersetzt jedes Vorkommen eines Zeichens oder Teilstrings:
Ausgabe:
5551234567
555.123.4567
Cats and dogs and CATS
dogs and dogs and dogs
dogs and cats and CATS
too many spaces
Die Überladung mit einem StringComparison-Argument gibt es ab .NET Core 2.0. Unter .NET Framework erledigt man das Ersetzen ohne Groß- und Kleinschreibung mit Regex.Replace(text, Regex.Escape(find), replacement, RegexOptions.IgnoreCase). Durch Ersetzen mit "" entfernst du Zeichen, und mehrere verkettete Replace-Aufrufe sind für eine Handvoll Ersetzungen in Ordnung.
Contains, IndexOf, StartsWith und EndsWith
Diese Methoden suchen. Contains antwortet mit Ja oder Nein; IndexOf und LastIndexOf geben eine Position zurück oder -1, wenn es keinen Treffer gibt; StartsWith und EndsWith prüfen die Enden.
Ausgabe:
True
False
True
True
8
30
28
-1
16
False
True
True
Alle beachten standardmäßig Groß- und Kleinschreibung. Contains(string, StringComparison) gibt es ab .NET Core 2.1; die Form IndexOf(...) >= 0 funktioniert in jeder Version, deshalb begegnet sie dir in älterem Code. IndexOfAny(new[] { ',', ';' }) findet das erste von mehreren Zeichen.
Ein Hinweis zur Kultur: Ohne StringComparison verwenden StartsWith, EndsWith, IndexOf(string) und CompareTo kulturabhängige Regeln, während Contains, Replace und IndexOf(char) ordinal vergleichen. Wer StringComparison.Ordinal oder OrdinalIgnoreCase explizit übergibt, beseitigt die Mehrdeutigkeit, und Code-Analyzer empfehlen genau das.
Trim, TrimStart und TrimEnd
Trim entfernt Leerraum (Leerzeichen, Tabs, Zeilenumbrüche) an beiden Enden. TrimStart und TrimEnd entfernen an einem Ende. Bekommen sie Zeichen übergeben, entfernen sie stattdessen diese:
Ausgabe:
[ana@example.com]
[ana@example.com \n]
[ x]
SALE
7
path/to/dir
1,234.50
Trim bearbeitet nur die Enden; Leerzeichen im Inneren des Strings bleiben erhalten. TrimStart('0') auf "000" gibt einen leeren String zurück, parse Zahlenstrings also mit int.Parse, statt Nullen von Hand zu entfernen.
ToUpper und ToLower
Ausgabe:
MAYA LOPEZ
maya lopez
MAYA LOPEZ
Coffee
ToUpper und ToLower folgen der aktuellen Kultur, im Türkischen ist "i".ToUpper() daher ein großes İ mit Punkt, nicht I. Für Bezeichner, Schlüssel und Dateinamen nimm ToUpperInvariant und ToLowerInvariant. Zum Vergleichen nimm eine StringComparison, statt die Schreibweise überhaupt umzuwandeln (siehe Strings). Um jedes Wort großzuschreiben, gibt es CultureInfo.CurrentCulture.TextInfo.ToTitleCase(text), das allerdings Wörter unverändert lässt, die schon komplett großgeschrieben sind.
PadLeft und PadRight
Auffüllen fügt Zeichen hinzu, bis der String eine Gesamtbreite erreicht. Das ist praktisch für Ausgaben mit fester Breite und um Codes mit Nullen aufzufüllen:
Ausgabe:
000042
[Tea ]
[ Tea]
Too long already
Espresso.. 2.40
Latte..... 3.60
Mocha..... 3.95
Die Ausrichtung bei der Interpolation ({name,-10}) erledigt dieselbe Aufgabe direkt im String.
Join und Concat
string.Join setzt ein Trennzeichen zwischen die Elemente einer beliebigen Collection. string.Concat verbindet ohne Trennzeichen:
Ausgabe:
Ana, Ben, Chloe
1 + 2 + 3
True
2026-09
AnaBenChloe
Ana, Ben and Chloe
Join ist der richtige Weg, eine Liste mit Trennzeichen zu bauen: Es gibt kein überzähliges Trennzeichen am Ende zu entfernen, und das Ergebnis entsteht in einem Durchgang. Es ruft für jedes Element ToString() auf und funktioniert daher auch mit Zahlen und Objekten.
Reverse, Insert und Remove
Es gibt keine Methode string.Reverse, die einen String zurückgibt. Die zwei üblichen Ansätze:
Ausgabe:
desserts
desserts
True
2026/Q3-09
Hello
HelloWorld
word.Reverse() allein gibt ein IEnumerable<char> zurück, keinen String; die Ausgabe zeigt einen Typnamen. Beide Methoden kehren UTF-16-Codeeinheiten um, was Zeichen aus zwei Einheiten (die meisten Emojis) und Buchstaben mit kombinierenden Akzenten zerstört.
Kurzübersicht
| Aufgabe | Methode |
|---|---|
| In Teile zerlegen | s.Split(','), s.Split(new[] {',', ';'}, StringSplitOptions.RemoveEmptyEntries) |
| Alle ersetzen | s.Replace("a", "b") |
| Enthält | s.Contains("x"), s.Contains("x", StringComparison.OrdinalIgnoreCase) |
| Position | s.IndexOf("x"), s.LastIndexOf('x') (-1, wenn nicht vorhanden) |
| Beginnt oder endet mit | s.StartsWith("x"), s.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) |
| Leerraum an den Enden entfernen | s.Trim(), s.TrimStart(), s.TrimEnd() |
| Schreibweise ändern | s.ToUpper(), s.ToLowerInvariant() |
| Auf eine Breite auffüllen | s.PadLeft(6, '0'), s.PadRight(10) |
| Collection verbinden | string.Join(", ", items) |
| Teil eines Strings | s.Substring(start, length) |
| Einfügen oder löschen | s.Insert(i, "x"), s.Remove(i, count) |
| Auf null oder leer prüfen | string.IsNullOrWhiteSpace(s) |
Häufig gestellte Fragen
Wie teile ich einen String in C#?
text.Split(',') gibt ein string[] mit den Teilen zwischen den Kommas zurück. Übergib mehrere Trennzeichen als Array (Split(new[] { ',', ';' })), ein String-Trennzeichen mit Split(new[] { ", " }, StringSplitOptions.None) und StringSplitOptions.RemoveEmptyEntries, um leere Teile zu verwerfen, die durch doppelte Trennzeichen entstehen. .NET 5 hat StringSplitOptions.TrimEntries hinzugefügt, das jeden Teil trimmt.
Wie prüfe ich, ob ein String einen anderen enthält, ohne Groß- und Kleinschreibung?
Ab .NET Core 2.1: text.Contains("error", StringComparison.OrdinalIgnoreCase). Unter .NET Framework, dem diese Überladung fehlt, nimm text.IndexOf("error", StringComparison.OrdinalIgnoreCase) >= 0. Vermeide text.ToLower().Contains(...), das eine Kopie allokiert und sich in manchen Kulturen falsch verhalten kann.
Verändert String.Replace in C# den ursprünglichen String?
Nein. Strings sind unveränderlich, also gibt Replace einen neuen String zurück, in dem jedes Vorkommen ersetzt ist, und lässt das Original, wie es war. Schreibe s = s.Replace("old", "new");. Es ersetzt alle Vorkommen, nicht nur das erste; um nur das erste zu ersetzen, finde es mit IndexOf und baue den String neu auf oder rufe Replace auf einer Regex-Instanz mit der Anzahl 1 auf.
Was gibt IndexOf zurück, wenn der String nicht gefunden wird?
-1. Jedes Ergebnis ab 0 ist die nullbasierte Position des ersten Treffers. Prüfe immer auf -1, bevor du das Ergebnis als Index verwendest, denn Substring(-1) wirft, und Substring(-1 + 1) gibt stillschweigend den ganzen String zurück. LastIndexOf funktioniert genauso und sucht vom Ende her.
Wie kehre ich in C# einen String um?
Kopiere ihn in ein char-Array, kehre das Array um und baue einen neuen String: char[] a = s.ToCharArray(); Array.Reverse(a); string r = new string(a);. Mit LINQ tut new string(s.Reverse().ToArray()) dasselbe. Beide kehren UTF-16-Einheiten um, Emojis und kombinierende Akzente können also durcheinandergeraten.