Warum sind geschweifte Klammern in C# ein Kopfzerbrechen?
Haben Sie jemals Code in C# geschrieben, einen Text wie {Name}: {Wert} ausgeben wollen und stattdessen eine FormatException erhalten? Wenn ja, sind Sie nicht allein. Die Frage „How to escape curly brace in String.Format“ auf Stack Overflow hat Zehntausende von Aufrufen. Und das ist kein Zufall: Geschweifte Klammern {} haben in C# eine besondere Bedeutung – sie kennzeichnen eine Stelle zum Einsetzen von Variablen.
Aber was tun, wenn Sie die Klammern selbst als normale Zeichen ausgeben müssen? Zum Beispiel für JSON, Vorlagen, Codegenerierung oder einfach für eine schöne Formatierung eines Berichts? Heute werden wir dieses Thema von A bis Z durchgehen: vom einfachen Escaping bis hin zu fortgeschrittenen Tricks mit StringBuilder und Zeichenfolgeninterpolation.
Wie man geschweifte Klammern escaped: Die Grundregel
Die Antwort ist einfach und elegant: Verdoppeln Sie die Klammer. Wenn Sie eine einzelne öffnende Klammer { ausgeben möchten, schreiben Sie {{. Für eine schließende } – }}. C# versteht dann, dass es sich nicht um einen Platzhalter, sondern um ein normales Zeichen handelt.
Hier ist das einfachste Beispiel:
string result = string.Format("Wert in geschweiften Klammern: {{0}}", 42);Console.WriteLine(result);// Ausgabe: Wert in geschweiften Klammern: {0}Beachten Sie: {{0}} ist kein Platzhalter, sondern ein escapetes Klammerpaar, in dem die Ziffer 0 steht. Wenn wir {0} geschrieben hätten, hätten wir den Wert der Variablen (die Zahl 42) erhalten.
Typischer Anfängerfehler
Anfänger schreiben oft so:
// FEHLER!string bad = string.Format("Hallo, {name}!", name);// FormatException: Input string was not in a correct format.Warum? Weil C# innerhalb der Klammern einen numerischen Index erwartet ({0}, {1}), nicht einen Variablennamen. Für Namen müssen Sie Zeichenfolgeninterpolation (dazu weiter unten) verwenden oder explizit Indizes angeben.
Praktische Beispiele: Vom Einfachen zum Komplexen
Lassen Sie uns einige reale Szenarien durchgehen, in denen das Escaping von Klammern notwendig ist.
1. Ausgabe von JSON oder XML zu Debugging-Zwecken
Stellen Sie sich vor, Sie schreiben einen Logger und möchten eine JSON-Zeichenfolge mit eingesetztem Wert ausgeben:
int userId = 101;string json = string.Format("{{\\"userId\\": {0}, \\"name\\": \\"Alice\\"}}", userId);Console.WriteLine(json);// Ausgabe: {"userId": 101, "name": "Alice"}Hier erzeugen {{ und }} die äußeren geschweiften Klammern des JSON, und {0} setzt die Zahl ein.
2. Generierung von Codevorlagen
Angenommen, Sie schreiben einen Codegenerator in C#. Sie müssen eine Zeichenfolge mit einer Vorlage für eine andere Sprache (z. B. Python oder JavaScript) erstellen:
string template = string.Format("def {0}(): return {{0}}", "calculate");Console.WriteLine(template);// Ausgabe:// def calculate():// return {0}Beachten Sie: {{0}} in der Ausgabezeile ist nun kein C#-Platzhalter mehr, sondern ein Teil des generierten Codes (z. B. für Python).
3. Formatierung mit mehreren Platzhaltern und Klammern
Wenn Sie Einsetzungen und Escaping mischen müssen, ist es wichtig, bei den Indizes nicht durcheinanderzukommen:
string name = "Bob";int age = 30;string message = string.Format("Benutzer {{ {0} }} (Alter: {1})", name, age);Console.WriteLine(message);// Ausgabe: Benutzer { Bob } (Alter: 30)Hier ergibt {{ ein {, }} ergibt ein }, und {0} und {1} setzen die Werte ein.
Alternativen zu String.Format: Zeichenfolgeninterpolation und StringBuilder
Obwohl string.Format ein Klassiker ist, gibt es in modernem C# bequemere Wege. Vergleichen wir sie.
Zeichenfolgeninterpolation (C# 6+)
Interpolation ist die Magie des $ vor der Zeichenfolge. Sie liest sich besser, aber das Escaping von Klammern bleibt