Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Tip
Dieser Artikel ist Teil des Abschnitts "Grundlagen" für Entwickler, die bereits mindestens eine Programmiersprache kennen und C# erlernen. Wenn Sie noch nicht mit der Programmierung vertraut sind, beginnen Sie zuerst mit den Lernprogrammen " Erste Schritte ".
Kommen Sie von Java oder C++? Ein C# string ist ein unveränderlicher Referenztyp, der auf String basiert. UTF-16 ist die In-Memory-Codierung, ähnlich wie die String von Java. Im Gegensatz zu C/C++ werden Zeichenfolgen nicht null-beendet und verfallen nicht in Zeiger.
Eine Zeichenfolge ist eine Abfolge von Zeichen. In C# ist string das Sprachschlüsselwort für den Typ System.String. Jedes Stringliteral, das Sie schreiben, erzeugt eine System.String-Instanz.
string im Vergleich zu String
Das string Schlüsselwort und der String Typname beziehen sich auf denselben Typ. Sie werden in identischer Zwischensprache (IL) kompiliert.
// The 'string' keyword is an alias for System.String. The two are identical.
string a = "hello";
String b = "hello";
Console.WriteLine(a == b); // True
Console.WriteLine(typeof(string) == typeof(String)); // True
Bevorzugen Sie das string Schlüsselwort in Ihrem eigenen Code. Es ist konsistent mit den anderen integrierten Typstichwörtern (int, bool, double), und es funktioniert ohne eine using System; Direktive.
Zeichenfolgen sind unveränderlich
Unveränderlich bedeutet, dass der Wert nach dem Erstellen nicht mehr geändert werden kann. Nachdem Sie ein Objekt stringerstellt haben, können Sie dessen Zeichen nicht mehr ändern. Methoden wie ToUpperInvariant, Replace, Substringund Trim geben eine neue Zeichenfolge zurück, die den geänderten Wert enthält. Die ursprüngliche Instanz bleibt gleich.
string greeting = "hello";
// ToUpper returns a *new* string. The original is unchanged.
string shouted = greeting.ToUpperInvariant();
Console.WriteLine(greeting); // hello
Console.WriteLine(shouted); // HELLO
Da Zeichenfolgen unveränderlich sind, können Sie sie sicher über Methoden und Threads hinweg freigeben. Diese Unveränderlichkeit erklärt, warum sich der string Typ in der täglichen Verwendung wie ein Werttyp verhält, obwohl es sich um einen Verweistyp handelt.
Wenn Sie in einer Schleife eine Zeichenfolge aus vielen kleinen Teilen erstellen, verwenden Sie StringBuilder, um diese direkt anzufügen und am Ende eine einzige Zeichenfolge zu erzeugen:
// For many sequential edits, StringBuilder avoids allocating a new string each time.
var builder = new StringBuilder();
for (int i = 1; i <= 3; i++)
{
builder.Append("item ").Append(i).Append(';');
}
string result = builder.ToString();
Console.WriteLine(result); // item 1;item 2;item 3;
Zeichenfolgenliterale
C# bietet vier Literale Formulare. Jedes Formular passt zu unterschiedlichen Inhalten. Als Kurzanleitung:
- Verwenden Sie normale Literale für kurzen, einfachen Text mit höchstens wenigen Escapesequenzen.
- Verwenden Sie Verbatimliterale, wenn Backslashes im Inhalt überwiegen, z. B. bei Windows-Pfaden oder Regex-Mustern.
- Verwenden Sie Rohzeichenfolgenliterale für mehrzeiligen oder strukturiert formatierten Text, z. B. Inline-JSON, SQL, XML oder formatierte Nachrichtenblöcke.
- Fügen Sie einem der oben genannten Literale ein
$Präfix hinzu, um eine interpolierte Zeichenfolge abzurufen, wenn Sie Werte einbetten müssen. - Fügen Sie einem Literal ein
u8Suffix hinzu, um eine UTF-8-Bytesequenz (a ReadOnlySpan<T> vonbyte) für byteorientierte APIs zu erzeugen. Ausführliche Informationen finden Sie unter UTF-8-Zeichenfolgenliterale in der Sprachreferenz.
Normale Literale und Escape-Sequenzen
Ein reguläres Zeichenfolgenliteral wird in doppelte Anführungszeichen eingeschlossen. Ein Backslash leitet eine Escape-Sequenz ein:
// Common escape sequences inside a regular string literal.
string tabbed = "name:\tAda"; // \t tab
string twoLines = "line 1\nline 2"; // \n newline
string quoted = "She said \"hi\"."; // \" literal quote
string path = "C:\\src\\app"; // \\ literal backslash
Console.WriteLine(tabbed);
Console.WriteLine(twoLines);
Console.WriteLine(quoted);
Console.WriteLine(path);
Gängige Escape-Sequenzen umfassen \n (Zeilenumbruch), \t (Tabulator), \" (wörtliches Anführungszeichen), \\ (wörtlicher Backslash), \0 (Nullzeichen) und Unicode-Escapes (\uXXXX, \UXXXXXXXX).
Ab C# 13 steht \e für das ESC-Steuerzeichen (U+001B). Es ist das Startbyte für ANSI-Terminal-Escape-Sequenzen:
// Beginning in C# 13, \e represents the ESC control character (U+001B).
// It's used to start ANSI terminal escape sequences.
string esc = "\e[31mError\e[0m: file missing";
Console.WriteLine(esc); // ESC[31mError ESC[0m: file missing
Console.WriteLine((int)'\e'); // 27
Verwenden Sie ein gewöhnliches Literal, wenn der Text kurz ist und nur eine Handvoll Escape-Sequenzen enthält. Sobald die Escape-Sequenzen zahlreicher werden als die sichtbaren Zeichen, wechseln Sie zu einem Verbatim-Literal oder einem Raw-Literal.
Verbatim-Literale
Einem Verbatim-Literal wird ein Präfix vorangestellt @. Backslashes werden wörtlich interpretiert, was für Windows-Pfade und Muster für reguläre Ausdrücke nützlich ist:
// A verbatim string literal (@) treats backslashes literally.
// Useful for Windows paths and regular expressions.
string winPath = @"C:\src\app\readme.md";
string pattern = @"\d{3}-\d{4}";
Console.WriteLine(winPath);
Console.WriteLine(pattern);
Um ein Anführungszeichen als Literal in eine Verbatim-Zeichenfolge einzubetten, verdoppeln Sie es: @"She said ""hi"".". Verbatim-Zeichenfolgen können auch mehrere physische Zeilen umfassen.
Verbatim-Literale sind die richtige Wahl, wenn Backslashes Teil des Inhalts sind, aber nicht viele eingebettete Anführungszeichen enthalten sind. Bei mehrteiligem Text oder Inhalt mit Anführungszeichen sind in der Regel unformatierte Zeichenfolgenliterale übersichtlicher.
Unformatierten Zeichenfolgenliterale
Für Literale, die Anführungszeichen, Backslashes oder mehrere Zeilen enthalten, verwenden Sie vorzugsweise Raw-String-Literale. Sie vermeiden escape-Rauschen vollständig, wodurch sie optimal für Inline-JSON-, SQL-, XML-, Regex-Muster und formatierte Textblöcke geeignet sind, in denen die Quelle wie die Ausgabe aussehen soll:
// Raw string literals use three or more quotes and need no escaping.
// The source looks like the output, which is ideal for inline JSON, SQL, XML, and the like.
string json = """
{
"name": "Ada",
"roles": ["admin", "editor"]
}
""";
string sql = """
SELECT Id, Name
FROM Users
WHERE Name = 'O''Brien'
""";
Console.WriteLine(json);
Console.WriteLine(sql);
Rohzeichenfolgenliterale machen Escape-Sequenzen nahezu überflüssig und ermöglichen jede benötigte Formatierung und Verwendung von Anführungszeichen. Die vollständigen Regeln finden Sie unter Rohzeichenfolgenliterale.
Interpolierte Zeichenfolgen
Ein $ Präfix wandelt ein Literal in eine interpolierte Zeichenfolge um. Ausdrücke in {} Löchern werden ausgewertet und deren Ergebnisse eingefügt, und Sie können Standardformatbezeichner und Ausrichtung innerhalb der Löcher anwenden. Interpolation lässt sich auch mit den anderen Literalformen kombinieren – verwenden Sie $@"...", um ein wortwörtliches Literal zu interpolieren, oder $"""...""", um ein Rohzeichenfolgenliteral für eine umfangreich formatierte Ausgabe zu interpolieren:
// The $ prefix evaluates expressions inside { } and inserts their values.
string name = "Ada";
int score = 92;
string greeting = $"Hello, {name}! Your score is {score}.";
// Format specifiers and alignment work inside the holes.
string formatted = $"pi = {Math.PI:F3}, padded = |{name,10}|";
// Combine $ and """ for richly formatted multiline output.
string report = $"""
Report for {name}
-----------------
Score : {score}
Grade : {(score >= 90 ? "A" : "B")}
""";
Console.WriteLine(greeting);
Console.WriteLine(formatted);
Console.WriteLine(report);
Interpolation ist die empfohlene Methode zum Verfassen von Zeichenfolgen aus Werten im alltäglichen Code.
Indizierung und char
A string ist eine Sequenz von UTF-16-Codeeinheiten. Der Indexer gibt eine System.Charzurück, die eine einzelne UTF-16-Codeeinheit darstellt, nicht unbedingt einen vollständigen Unicode-Codepunkt.
Length gibt die Anzahl der Codeeinheiten zurück.
// A string is a sequence of UTF-16 code units. s[i] returns one char.
string word = "café";
Console.WriteLine(word.Length); // 4
Console.WriteLine(word[0]); // c
foreach (char c in word)
{
Console.Write($"{c} "); // c a f é
}
Console.WriteLine();
Für Text, der Emojis oder Zeichen außerhalb der Basic Multilingual Plane enthalten kann, iterieren Sie mithilfe von Rune nach Rune oder mithilfe von StringInfo nach Graphemclustern. Eine einfache char-Iteration funktioniert für die meisten westlichen Texte und ASCII-dominierten Inhalte.
String-Gleichheit
Gleichheit bei string vergleicht die Zeichenfolgen, nicht Verweise:
// String equality compares character sequences, not references.
string left = "hello";
string right = string.Concat("hel", "lo");
Console.WriteLine(left == right); // True
Console.WriteLine(left.Equals(right, StringComparison.Ordinal)); // True
Für Vergleiche, die gebietsschemafähig oder fallfähig sein müssen, übergeben Sie einen expliziten StringComparison Wert. Verwenden Sie StringComparison.Ordinal für Protokollwerte, Bezeichner und anderen nichtsprachlichen Text.
Häufige Operationen mit Zeichenfolgen
Verwenden Sie die folgende Tabelle als Kurzanleitung für alltägliche Zeichenfolgenvorgänge in C#:
| Category | Was es abdeckt |
|---|---|
| Search | Suchen nach Zeichen oder Teilzeichenfolgen, Testpräfixen und Suffixen |
| Split | Eine Zeichenfolge anhand von Trennzeichen in Teilzeichenfolgen aufteilen |
| Verketten | Kombinieren von Zeichenfolgen — +, Interpolation, Concat, Join |
| Modify | Erstellen einer transformierten Kopie — Replace, , TrimSubstring |
| Vergleichen | Gleichheit und Reihenfolge mit dem richtigen StringComparison prüfen |
Die vollständige API-Oberfläche – jede Überladung, jede Methode – wird in der String Referenz dokumentiert.