String-Interpolation baut einen String aus wörtlichem Text und Ausdrücken. Stelle dem Literal ein $ voran, setze einen beliebigen C#-Ausdruck in geschweifte Klammern, und sein Wert wird in Text umgewandelt und eingefügt:
Ausgabe:
Hello, Maya!
3 items at 4.5 = 13.5
Name has 4 letters, upper: MAYA
Free shipping: yes
Interpolation kam mit C# 6. Der Compiler macht daraus einen Aufruf von string.Format oder string.Concat (oder seit C# 10 effizienteren Handler-Code), sie ist also nicht langsamer, als den String von Hand zu bauen.
Der Bedingungsausdruck in der letzten Zeile braucht Klammern. In einem Interpolationsloch leitet ein Doppelpunkt einen Formatbezeichner ein, daher ist {x > 10 ? "yes" : "no"} ohne Klammern ein Kompilierfehler.
Formatbezeichner
Nach dem Ausdruck steuern ein Doppelpunkt und ein Formatstring, wie der Wert geschrieben wird. Dieselben Formatstrings funktionieren mit ToString("...") und string.Format.
Ausgabe:
1234567.89
1,234,567.89
1,234,568
00042
FF
00ff
1.23E+006
0.813
81.3%
1,234,567.89
007.5
3.1
Die Standardcodes, jeweils optional gefolgt von einer Genauigkeitsangabe:
| Code | Name | Beispiel | Ergebnis |
|---|---|---|---|
F oder F2 | Festkomma | {3.14159:F2} | 3.14 |
N oder N0 | Zahl mit Gruppentrennzeichen | {1234.56:N0} | 1,235 |
C | Währung (Symbol und Muster der Kultur) | {9.5:C} in en-US | $9.50 |
D5 | Ganzzahl mit Nullen aufgefüllt | {42:D5} | 00042 |
X, x | Hexadezimal | {255:X} | FF |
E2 | Wissenschaftlich | {1234.5:E2} | 1.23E+003 |
P1 | Prozent (multipliziert mit 100) | {0.256:P1} in en-US | 25.6% |
G | Allgemein (kürzeste Form) | {2.50m:G} | 2.50 |
R | Round-trip (double) | {0.1:R} | 0.1 |
Benutzerdefinierte Muster bauen ein Format aus Platzhaltern: 0 ist eine Ziffer, die immer angezeigt wird, # eine Ziffer, die nur angezeigt wird, wenn sie signifikant ist, . ist das Dezimaltrennzeichen, , innerhalb der Zahl aktiviert Gruppentrennzeichen, und % multipliziert mit 100. "0.##" zeigt bis zu zwei Nachkommastellen und lässt nachgestellte Nullen weg; "#,##0.00" ist das klassische Buchhaltungsformat.
Jede numerische Formatierung rundet den angezeigten Wert; die Variable selbst bleibt unverändert. Liegt ein Wert genau in der Mitte (2.25 mit einer Nachkommastelle angezeigt), können verschiedene Runtimes und Typen diesen Gleichstand unterschiedlich runden. Wenn die Regel wichtig ist, runde also vorher explizit mit Math.Round(value, 1, MidpointRounding.AwayFromZero) und formatiere dann.
Datumswerte in der Interpolation
DateTime-Werte nehmen auf dieselbe Weise Datumsformatstrings an:
Ausgabe:
2026-09-24
24/09/2026 16:05
Thu, Sep 24
Shipped at 16:05 on Thursday
ETA 02:10
2.2 hours
Ein benutzerdefiniertes Format für TimeSpan verlangt, dass wörtliche Zeichen mit einem Backslash escaped werden, was in einem normalen String-Literal als \\: geschrieben wird. Die vollständige Liste der Datumscodes (yyyy, MM, HH, tt...) und die typischen Fehler damit (mm sind Minuten, MM sind Monate) findest du unter DateTime-Format.
Ausrichtung und Auffüllen
Ein Komma nach dem Ausdruck legt eine Mindestbreite des Felds fest. Eine positive Zahl richtet rechtsbündig aus, eine negative linksbündig. Zusammen mit einem Format richtet das Tabellen in reinem Text aus:
Ausgabe:
Item | Price| Sold
----------------------------
Espresso | 2.40| 118
Latte | 3.60| 64
Hot chocolate | 4.25| 9
Die Syntax ist {expression,alignment:format}: zuerst die Ausrichtung, dann das Format. Ein Wert, der länger als die Breite ist, wird nicht abgeschnitten; er schiebt den Rest der Zeile weiter. PadLeft und PadRight füllen außerhalb der Interpolation auf dieselbe Weise auf.
Geschweifte Klammern escapen
Um eine wörtliche Klammer auszugeben, verdopple sie: {{ und }}. Das kommt vor, wenn die Ausgabe JSON, CSS oder Code ist:
Ausgabe:
{ "id": 42, "name": "Ana" }
Set literal: {1, 2, 3}
{42}
JSON so von Hand zu bauen ist für eine schnelle Logzeile in Ordnung; für echtes JSON nimm einen Serializer, der Anführungszeichen und Sonderzeichen in name korrekt behandelt.
string.Format und kombinierte Formatierung
Vor C# 6 wurde mit string.Format formatiert, das nummerierte Platzhalter und eine Liste von Argumenten nimmt. Dieselbe Syntax der kombinierten Formatierung akzeptieren Console.WriteLine, StringBuilder.AppendFormat und TextWriter.Write:
Ausgabe:
Notebook x4: 14.00
Notebook | 3.50
echo echo !
Dear Leo, your order #000731 has shipped.
Im Code ist Interpolation vorzuziehen: Die Werte stehen dort, wo sie erscheinen, ein Platzhalter kann also nicht auf das falsche Argument zeigen. string.Format bleibt das richtige Werkzeug, wenn die Vorlage Daten ist, etwa eine übersetzte Meldung aus einer Ressourcendatei. Ein Platzhalterindex ohne passendes Argument ({2} bei zwei Argumenten) wirft zur Laufzeit eine FormatException.
Kultur: Trennzeichen und Währung steuern
Interpolation, ToString und string.Format verwenden standardmäßig alle die aktuelle Kultur des Threads. Auf einem auf Deutsch eingestellten Rechner ergibt {1234.5:N2} den Text 1.234,50, in den USA 1,234.50. Das Währungsformat C verwendet das Symbol der Kultur. Um die Kultur explizit zu wählen, fange den interpolierten String als FormattableString ab und formatiere ihn mit einem Provider:
Ausgabe:
Total: 1,234.50
Total: 1.234,50
$1,234.50
1.234,50
1234.5,0.75
Nimm die Kultur des Benutzers für Text, den Menschen lesen, und CultureInfo.InvariantCulture für alles, was ein anderes Programm liest. Eine CSV-Datei, die auf einem deutschen Rechner mit der aktuellen Kultur geschrieben wurde, hat Kommas in Zahlen und ist anderswo nicht lesbar. Ab .NET 6 tut string.Create(CultureInfo.InvariantCulture, $"...") dasselbe wie FormattableString.Invariant, ohne das Zwischenobjekt.
Verbatim- und Raw-Interpolation
$ lässt sich mit @ zu einem interpolierten Verbatim-String kombinieren: Backslashes sind wörtlich, und der String darf sich über mehrere Zeilen erstrecken. Ab C# 8 ist jede Reihenfolge erlaubt ($@ oder @$); C# 6 und 7 verlangen $@:
Ausgabe:
C:\Users\ana\Reports\2026\summary.txt
Report for ana
Year: 2026
C# 11 hat interpolierte Raw-Strings eingeführt. Mit einem $ markieren Klammern wie gewohnt Ausdrücke. Mit $$ ist eine einzelne Klammer wörtlich, und Ausdrücke brauchen zwei Klammern, was JSON- und Code-Vorlagen lesbar macht:
// C# 11 and later
int id = 42;
string name = "Ana";
string json = $$"""
{
"id": {{id}},
"name": "{{name}}"
}
""";
C# 11 erlaubt außerdem Zeilenumbrüche innerhalb eines Interpolationslochs, ein langer Ausdruck oder ein switch-Ausdruck lässt sich also auf mehrere Zeilen verteilen.
Häufige Fehler
- Das
$vergessen."Total: {total}"gibt die Klammern wörtlich aus. Der Compiler warnt nicht. - Ein Bedingungsoperator ohne Klammern innerhalb der geschweiften Klammern: Der Doppelpunkt wird als Formattrenner gelesen.
- Maschinenlesbare Ausgabe mit der aktuellen Kultur formatieren. Dezimalkommas zerstören CSV, JSON und SQL. Nimm die invariante Kultur.
ToString()ohne Format für Geld verwenden.2.5mwird als2.5ausgegeben, nicht als2.50. NimmF2,N2oderC.- Große Strings in einer Schleife mit Interpolation bauen. Jeder Durchlauf erzeugt einen neuen String; nimm StringBuilder oder
string.Join.
Häufig gestellte Fragen
Was ist String-Interpolation in C#?
Ein String-Literal mit vorangestelltem $, in dem Ausdrücke in geschweiften Klammern ausgewertet und eingefügt werden: $"Total: {price * qty}". Sie kam mit C# 6 und ersetzt die meisten Verwendungen von string.Format und Verkettung mit +. In den Klammern funktioniert jeder Ausdruck, auch Methodenaufrufe und Property-Zugriffe.
Wie formatiere ich in C# eine Zahl mit 2 Nachkommastellen?
Hänge nach einem Doppelpunkt einen Formatbezeichner an: $"{price:F2}" gibt 2 Stellen nach dem Dezimaltrennzeichen aus, und $"{price:N2}" tut dasselbe mit Tausendertrennzeichen. Außerhalb der Interpolation funktionieren dieselben Codes mit price.ToString("F2"). Beide runden den Wert für die Anzeige, ohne ihn zu verändern.
Wie escape ich geschweifte Klammern in einem interpolierten String in C#?
Verdopple sie: {{ gibt { aus und }} gibt } aus. Zum Beispiel gibt $"{{ \"id\": {id} }}" den Text { "id": 42 } aus. In interpolierten Raw-Strings aus C# 11 kannst du das Literal stattdessen mit $$ beginnen, dann sind einfache Klammern wörtlich, und {{expr}} markiert einen Ausdruck.
Was ist der Unterschied zwischen string.Format und String-Interpolation?
Sie liefern dasselbe Ergebnis mit denselben Formatcodes. string.Format("{0} costs {1:F2}", name, price) verweist über die Position auf Argumente; $"{name} costs {price:F2}" schreibt die Ausdrücke direkt hinein, ist also leichter zu lesen und kann die Reihenfolge der Argumente nicht vertauschen. string.Format brauchst du weiterhin, wenn der Formatstring selbst aus einer Ressourcendatei oder einer Datenbank kommt.
Warum zeigt meine interpolierte Zahl ein Komma statt eines Punkts?
Interpolation formatiert mit der aktuellen Kultur des Threads, und viele Kulturen verwenden ein Komma als Dezimaltrennzeichen. Für Ausgaben, die Maschinen lesen (Dateien, JSON, URLs), formatiere mit der invarianten Kultur: FormattableString.Invariant($"{value:F2}") oder ab .NET 6 string.Create(CultureInfo.InvariantCulture, $"...").