Zeichenfolgen (C#-Programmierhandbuch)

Eine Zeichenfolge ist ein Objekt des Typs String, dessen Wert Text ist. Intern wird der Text als sequenzielle schreibgeschützte Auflistung von Char-Objekten gespeichert. Es gibt kein mit NULL endendes Zeichen am Ende einer C#-Zeichenfolge. Deshalb kann eine C#-Zeichenfolge eine beliebige Anzahl eingebetteter NULL-Zeichen („\0“) enthalten. Die Eigenschaft Length einer Zeichenfolge stellt die Anzahl von Char-Objekten dar, die darin enthalten sind, nicht die Anzahl der Unicode-Zeichen. Verwenden Sie für den Zugriff auf einzelne Unicode-Codepunkte in einer Zeichenfolge das Objekt StringInfo.

String im Vergleich zu System.String

In C# ist das Schlüsselwort string ein Alias für String. Aus diesem Grund sind String und string gleich, und Sie können eine beliebige Benennungskonvention verwenden. Die String-Klasse bietet viele Methoden zum sicheren Erstellen, Bearbeiten und Vergleichen von Zeichenfolgen. Außerdem überlädt die Programmiersprache C# einige Operatoren, um allgemeine Zeichenfolgenoperationen zu vereinfachen. Weitere Informationen über das Schlüsselwort finden Sie unter String. Weitere Informationen zum Typ und dessen Methoden finden Sie unter String.

Deklarieren und Initialisieren von Zeichenfolgen

Sie können Zeichenfolgen auf verschiedene Weise deklarieren und Initialisieren, wie im folgenden Beispiel gezeigt:

// Declare without initializing.
string message1;

// Initialize to null.
string message2 = null;

// Initialize as an empty string.
// Use the Empty constant instead of the literal "".
string message3 = System.String.Empty;

//Initialize with a regular string literal.
string oldPath = "c:\\Program Files\\Microsoft Visual Studio 8.0";

// Initialize with a verbatim string literal.
string newPath = @"c:\Program Files\Microsoft Visual Studio 9.0";

// Use System.String if you prefer.
System.String greeting = "Hello World!";

// In local variables (i.e. within a method body)
// you can use implicit typing.
var temp = "I'm still a strongly-typed System.String!";

// Use a const string to prevent 'message4' from
// being used to store another string value.
const string message4 = "You can't get rid of me!";

// Use the String constructor only when creating
// a string from a char*, char[], or sbyte*. See
// System.String documentation for details.
char[] letters = { 'A', 'B', 'C' };
string alphabet = new string(letters);

Beachten Sie, dass Sie nicht den neuen Operator zum Erstellen eines Zeichenfolgenobjekts verwenden, außer wenn Sie die Zeichenfolge mit einem Array von Chars initialisieren.

Initialisieren Sie eine Zeichenfolge mit dem konstanten Wert Empty, um ein neues String-Objekt zu erstellen, dessen Zeichenfolge eine Länge von 0 hat. Die Darstellung des Zeichenfolgenliterals einer Zeichenfolge mit einer Länge von 0 ist "". Indem Zeichenfolgen mit dem Wert Empty anstatt NULL initialisiert werden, können Sie die Chancen einer auftretenden NullReferenceException reduzieren. Verwenden Sie die statische Methode IsNullOrEmpty(String), um den Wert einer Zeichenfolge zu überprüfen, bevor Sie versuchen, auf sie zuzugreifen.

Unveränderlichkeit von Zeichenfolgenobjekten

Zeichenfolgenobjekte sind unveränderlich: sie können nicht geändert werden, nachdem sie erstellt wurden. Alle String-Methoden und C#-Operatoren, die eine Zeichenfolge scheinbar verändern, geben in Wirklichkeit die Ergebnisse in einem neuen Zeichenfolgenobjekt zurück. Im folgenden Beispiel werden die beiden ursprünglichen Zeichenfolgen nicht geändert, wenn die Inhalte von s1 und s2 verkettet werden, um eine einzelne Zeichenfolge zu bilden. Der +=-Operator erstellt eine neue Zeichenfolge, die die kombinierten Inhalte enthält. Das neue Objekt wird der Variablen s1 zugewiesen, und das ursprüngliche Objekt, das s1 zugewiesen wurde, wird für die Garbage Collection freigegeben, da keine andere Variable einen Verweis darauf enthält.

string s1 = "A string is more ";
string s2 = "than the sum of its chars.";

// Concatenate s1 and s2. This actually creates a new
// string object and stores it in s1, releasing the
// reference to the original object.
s1 += s2;

System.Console.WriteLine(s1);
// Output: A string is more than the sum of its chars.

Da eine „Zeichenfolgenänderung“ in Wirklichkeit eine neue Erstellung von Zeichenfolgen ist, müssen Sie vorsichtig sein, wenn Sie Verweise auf Zeichenfolgen erstellen. Wenn Sie einen Verweis auf eine Zeichenfolge erstellen und dann die ursprüngliche Zeichenfolge „ändern“, wird der Verweis weiterhin auf das ursprüngliche Objekt anstelle des neuen Objekts zeigen, das erstellt wurde, als die Zeichenfolge geändert wurde. Der folgende Code veranschaulicht dieses Verhalten:

string s1 = "Hello ";
string s2 = s1;
s1 += "World";

System.Console.WriteLine(s2);
//Output: Hello

Weitere Informationen zum Erstellen neuer Zeichenfolgen, die auf Änderungen wie Vorgänge zum Suchen und Ersetzen auf der ursprüngliche Zeichenfolge basieren, finden Sie unter Vorgehensweise: Ändern von Zeichenfolgeninhalten.

Reguläre und ausführliche Zeichenfolgenliterale

Verwenden Sie reguläre Zeichenfolgenliterale, wenn Sie von C# bereitgestellte Escapezeichen einbetten müssen, wie im folgenden Beispiel gezeigt:

string columns = "Column 1\tColumn 2\tColumn 3";
//Output: Column 1        Column 2        Column 3

string rows = "Row 1\r\nRow 2\r\nRow 3";
/* Output:
  Row 1
  Row 2
  Row 3
*/

string title = "\"The \u00C6olean Harp\", by Samuel Taylor Coleridge";
//Output: "The Æolean Harp", by Samuel Taylor Coleridge

Verwenden Sie ausführliche Zeichenfolgen der Einfachheit und Lesbarkeit halber, wenn der Text der Zeichenfolge umgekehrte Schrägstriche enthält, z.B. in Dateipfaden. Da ausführliche Zeichenfolgen neue Zeilenzeichen als Teil des Texts der Zeichenfolge beibehalten, können sie verwendet werden, um mehrzeilige Zeichenfolgen zu initialisieren. Verwenden Sie doppelte Anführungszeichen, um ein Anführungszeichen in eine ausführliche Zeichenfolge einzubetten. Im folgenden Beispiel werden einige gängige Verwendungszwecke für allgemeine Zeichenfolgen dargestellt:

string filePath = @"C:\Users\scoleridge\Documents\";
//Output: C:\Users\scoleridge\Documents\

string text = @"My pensive SARA ! thy soft cheek reclined
    Thus on mine arm, most soothing sweet it is
    To sit beside our Cot,...";
/* Output:
My pensive SARA ! thy soft cheek reclined
   Thus on mine arm, most soothing sweet it is
   To sit beside our Cot,... 
*/

string quote = @"Her name was ""Sara.""";
//Output: Her name was "Sara."

Zeichenfolgen-Escapesequenzen

Escapesequenz Zeichenname Unicode-Codierung
\' Einfaches Anführungszeichen 0x0027
\" Doppeltes Anführungszeichen 0x0022
\\ Umgekehrter Schrägstrich 0x005C
\0 Null 0x0000
\a Warnung 0x0007
\b Rückschritt 0x0008
\f Seitenvorschub 0x000C
\n Zeilenwechsel 0x000A
\r Wagenrücklauf 0x000D
\t Horizontaler Tabulator 0x0009
\U Unicode-Escapesequenz für Ersatzzeichenpaare \Unnnnnnnn
\u Unicode-Escapesequenz \u0041 = "A"
\v Vertikaler Tabulator 0x000B
\x Unicode-Escapesequenz, die ähnlich wie "\u" ist, außer mit variabler Länge \x0041 = "A"
Hinweis

Zum Zeitpunkt der Kompilierung werden ausführliche Zeichenfolgen in normale Zeichenfolgen mit gleichen Escapesequenzen konvertiert. Aus diesem Grund sehen Sie die Escapezeichen, die vom Compiler hinzugefügt werden, und nicht die ausführliche Version aus Ihrem Sourcecode, wenn Sie eine ausführliche Zeichenfolge in Debugger-Überwachungsfenster anzeigen. Die ausführliche Zeichenfolge @"C:\files.txt" erscheint z.B. im Überwachungsfenster als "C:\\files.txt".

Formatzeichenfolgen

Eine Formatzeichenfolge ist eine Zeichenfolge, deren Inhalt zur Laufzeit dynamisch bestimmt werden kann. Sie erstellen eine Zeichenfolge mithilfe der statischen Format-Methode und betten Platzhalter in geschweiften Klammern ein, die durch andere Werte zur Laufzeit ersetzt werden. Das folgende Beispiel verwendet eine Formatzeichenfolge, um das Ergebnis jeder Iteration einer Schleife auszugeben:

class FormatString
{
    static void Main()
    {
        // Get user input.
        System.Console.WriteLine("Enter a number");
        string input = System.Console.ReadLine();

        // Convert the input string to an int.
        int j;
        System.Int32.TryParse(input, out j);

        // Write a different string each iteration.
        string s;
        for (int i = 0; i < 10; i++)
        {
            // A simple format string with no alignment formatting.
            s = System.String.Format("{0} times {1} = {2}", i, j, (i * j));
            System.Console.WriteLine(s);
        }

        //Keep the console window open in debug mode.
        System.Console.ReadKey();
    }
}

Eine Überladung der WriteLine-Methode übernimmt eine Formatzeichenfolge als Parameter. Aus diesem Grund können Sie nur ein Formatzeichenfolgenliteral ohne den expliziten Aufruf der Methode einbetten. Wenn Sie jedoch die WriteLine-Methode zum Anzeigen der Debugausgabe im Ausgabefenster von Visual Studio verwenden, müssen Sie explizit die Format-Methode aufrufen, da WriteLine nur eine Zeichenfolge und keine Formatzeichenfolge akzeptiert. Weitere Informationen zu Formatzeichenfolgen finden Sie unter Formatierung von Typen.

Teilzeichenfolgen

Eine Teilzeichenfolge ist eine beliebige Sequenz von Zeichen, die in einer Zeichenfolge enthalten ist. Verwenden Sie die Substring-Methode, um eine neue Zeichenfolge aus einem Teil der ursprünglichen Zeichenfolge zu erstellen. Sie können nach einem oder mehreren Vorkommnissen einer Teilzeichenfolge suchen, indem Sie die IndexOf-Methode verwenden. Verwenden Sie die Replace-Methode, um alle Vorkommnisse einer angegebenen Teilzeichenfolge mit einer neuen Zeichenfolge zu ersetzen. Genauso wie die Substring-Methode gibt Replace tatsächlich eine neue Zeichenfolge zurück und ändert nicht die ursprüngliche Zeichenfolge. Weitere Informationen finden Sie unter Vorgehensweise: Suchen von Zeichenfolgen mithilfe von Zeichenfolgenmethoden und Vorgehensweise: Ändern von Zeichenfolgeninhalten.

string s3 = "Visual C# Express";
System.Console.WriteLine(s3.Substring(7, 2));
// Output: "C#"

System.Console.WriteLine(s3.Replace("C#", "Basic"));
// Output: "Visual Basic Express"

// Index values are zero-based
int index = s3.IndexOf("C");
// index = 7

Zugreifen auf einzelne Zeichen

Sie können die Arraynotation mit einem Indexwert verwenden, um schreibgeschützten Zugriff auf einzelne Zeichen zu erhalten, so wie in folgendem Beispiel gezeigt:

string s5 = "Printing backwards";

for (int i = 0; i < s5.Length; i++)
{
    System.Console.Write(s5[s5.Length - i - 1]);
}
// Output: "sdrawkcab gnitnirP"

Wenn die String-Methoden nicht die Funktionen bieten, die Sie zum Bearbeiten einzelner Zeichen in einer Zeichenfolge benötigen, können Sie ein StringBuilder-Objekt verwenden, um die einzelnen Chars „direkt“ zu bearbeiten und anschließend eine neue Zeichenfolge zu StringBuilder-Methoden zu speichern. Im folgenden Beispiel wird davon ausgegangen, dass Sie die ursprüngliche Zeichenfolge auf eine bestimmte Weise ändern und die Ergebnisse für die zukünftige Verwendung speichern müssen:

string question = "hOW DOES mICROSOFT wORD DEAL WITH THE cAPS lOCK KEY?";
System.Text.StringBuilder sb = new System.Text.StringBuilder(question);

for (int j = 0; j < sb.Length; j++)
{
    if (System.Char.IsLower(sb[j]) == true)
        sb[j] = System.Char.ToUpper(sb[j]);
    else if (System.Char.IsUpper(sb[j]) == true)
        sb[j] = System.Char.ToLower(sb[j]);
}
// Store the new string.
string corrected = sb.ToString();
System.Console.WriteLine(corrected);
// Output: How does Microsoft Word deal with the Caps Lock key?            

NULL-Zeichenfolgen und leere Zeichenfolgen

Eine leere Zeichenfolge ist eine Instanz eines System.String-Objekts, dass 0 Zeichen enthält. Leere Zeichenfolgen werden häufig in verschiedenen Programmierszenarios verwendet, um ein leeres Textfeld darzustellen. Sie können Methoden für leere Zeichenfolgen aufrufen, da sie gültige System.String-Objekte sind. Leere Zeichenfolgen werden wie folgt initialisiert:

string s = String.Empty;  

Im Gegensatz dazu, verweist eine NULL-Zeichenfolge nicht auf eine Instanz eines System.String-Objekts und jeder Versuch, eine Methode für eine NULL-Zeichenfolge aufzurufen, löst eine NullReferenceException aus. Allerdings können Sie NULL-Zeichenfolgen in Verkettungs- und Vergleichsoperationen mit anderen Zeichenfolgen verwenden. Die folgenden Beispiele veranschaulichen einige Fälle, in denen ein Verweis auf eine NULL-Zeichenfolge nicht dazu führt, dass eine Ausnahme ausgelöst wird:

static void Main()
{
    string str = "hello";
    string nullStr = null;
    string emptyStr = String.Empty;

    string tempStr = str + nullStr;
    // Output of the following line: hello
    Console.WriteLine(tempStr);

    bool b = (emptyStr == nullStr);
    // Output of the following line: False
    Console.WriteLine(b);

    // The following line creates a new empty string.
    string newStr = emptyStr + nullStr;

    // Null strings and empty strings behave differently. The following
    // two lines display 0.
    Console.WriteLine(emptyStr.Length);
    Console.WriteLine(newStr.Length);
    // The following line raises a NullReferenceException.
    //Console.WriteLine(nullStr.Length);

    // The null character can be displayed and counted, like other chars.
    string s1 = "\x0" + "abc";
    string s2 = "abc" + "\x0";
    // Output of the following line: * abc*
    Console.WriteLine("*" + s1 + "*");
    // Output of the following line: *abc *
    Console.WriteLine("*" + s2 + "*");
    // Output of the following line: 4
    Console.WriteLine(s2.Length);
}

Verwenden von StringBuilder für die schnelle Erstellung von Zeichenfolgen

Zeichenfolgenoperationen in .NET werden hochgradig optimiert und wirken sich in den meisten Fällen nicht erheblich auf die Leistung aus. In einigen Szenarios, z.B. in engen Schleifen, die Hunderttausende Male ausgeführt werden, können sich Zeichenfolgenoperationen auf die Leistung auswirken. Die StringBuilder-Klasse erstellt einen Zeichenfolgenpuffer, der eine verbesserte Leistung mit sich bringt, wenn Ihr Programm viele Zeichenfolgenbearbeitungen durchführt. Mit der StringBuilder-Zeichenfolge können Sie auch einzelne Zeichen erneut zuweisen, was der integrierte String-Datentyp nicht unterstützt. Dieser Code ändert z.B. den Inhalt einer Zeichenfolge ohne eine neue Zeichenfolge zu erstellen:

System.Text.StringBuilder sb = new System.Text.StringBuilder("Rat: the ideal pet");
sb[0] = 'C';
System.Console.WriteLine(sb.ToString());
System.Console.ReadLine();

//Outputs Cat: the ideal pet

In diesem Beispiel wird ein StringBuilder-Objekt zum Erstellen einer Zeichenfolge aus einem Satz von numerischen Typen verwendet:

class TestStringBuilder
{
    static void Main()
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();

        // Create a string composed of numbers 0 - 9
        for (int i = 0; i < 10; i++)
        {
            sb.Append(i.ToString());
        }
        System.Console.WriteLine(sb);  // displays 0123456789

        // Copy one character of the string (not possible with a System.String)
        sb[0] = sb[9];

        System.Console.WriteLine(sb);  // displays 9123456789
    }
}

Zeichenfolgen, Erweiterungsmethoden und LINQ

Da der String-Typ IEnumerable<T> implementiert, können Sie die Erweiterungsmethode verwenden, die in der Enumerable-Klasse auf Zeichenfolgen definiert ist. Um „visuelle Überfrachtung“ zu vermeiden, werden diese Methode für den String-Typ aus IntelliSense ausgeschlossen, nichtsdestotrotz sind sie weiterhin verfügbar. Sie können auch LINQ-Abfrageausdrücke in Zeichenfolgen verwenden. Weitere Informationen finden Sie unter LINQ und Zeichenfolgen.

Thema Beschreibung
Gewusst wie: Ändern von Zeichenfolgeninhalten Enthält ein Codebeispiel, das zeigt, wie die Inhalte von Zeichenfolgen geändert werden
Gewusst wie: Verketten von mehreren Zeichenfolgen Veranschaulicht, wie der +-Operator und die Stringbuilder-Klasse verwendet werden, um Zeichenfolgen zur Kompilierzeit und Laufzeit zu verknüpfen
Gewusst wie: Vergleichen von Zeichenfolgen Zeigt, wie Ordinalzahlenvergleiche von Zeichenfolgen durchgeführt werden
Vorgehensweise: Analysieren von Zeichenfolgen mithilfe von String.Split Enthält ein Codebeispiel, das veranschaulicht, wie Sie die String.Split-Methode zum Analysieren von Zeichenfolgen verwenden
Gewusst wie: Suchen von Zeichenfolgen mithilfe von Zeichenfolgenmethoden Erläutert, wie bestimmte Methoden zum Suchen von Zeichenfolgen verwendet werden
Gewusst wie: Suchen von Zeichenfolgen mithilfe von regulären Ausdrücken Erläutert, wie reguläre Ausdrücken zum Suchen von Zeichenfolgen verwendet werden
Gewusst wie: Bestimmen, ob eine Zeichenfolge einen numerischen Wert darstellt Zeigt, wie Sie sicher eine Zeichenfolge analysieren, um zu sehen, ob diese über einen gültigen numerischen Wert verfügt
Gewusst wie: Konvertieren einer Zeichenfolge in einen DateTime-Wert Zeigt, wie eine Zeichenfolge wie "01/24/2008" in ein System.DateTime-Objekt konvertiert wird
Grundlegende Zeichenfolgenoperationen Stellt Links zu Themen bereit, die System.String- und System.Text.StringBuilder-Methoden verwenden, um grundlegende Zeichenfolgenoperationen durchzuführen
Analysieren von Zeichenfolgen Beschreibt, wie Zeichen oder Leerzeichen in eine Zeichenfolge eingefügt werden
Vergleichen von Zeichenfolgen Enthält Informationen, wie Zeichenfolgen verglichen werden, und gibt Beispiele in C# und Visual Basic
Verwenden der StringBuilder-Klasse Beschreibt das Erstellen und Ändern dynamischer Zeichenfolgenobjekte mithilfe der StringBuilder-Klasse
LINQ und Zeichenfolgen Enthält Informationen zum Ausführen verschiedener Zeichenfolgenoperationen mithilfe von LINQ-Abfragen
C#-Programmierhandbuch Enthält Links zu Themen, in denen die Konstrukte der Programmierung in C# beschrieben werden