Zeichenfolgeninterpolation in C#

In diesem Tutorial erfahren Sie, wie Sie die Zeichenfolgeninterpolation verwenden, um Ausdrucksergebnisse zu einer Ergebniszeichenfolge hinzuzufügen. Für diese Beispiele wird davon ausgegangen, dass Sie sich mit den grundlegenden C#-Konzepten und der .NET-Typformatierung auskennen. Wenn Sie sich mit der Zeichenfolgeninterpolation oder der .NET-Typformatierung nicht auskennen, absolvieren Sie zuerst das interaktive Tutorial zur Zeichenfolgeninterpolation. Weitere Informationen zum Formatieren von Typen in .NET finden Sie unter Formatieren von Typen in .NET.

Einführung

Wenn Sie ein Zeichenfolgenliteral als interpolierte Zeichenfolge ermitteln möchten, stellen Sie ihm ein $-Symbol voran. Sie können jeden gültigen C#-Ausdruck einbetten, der einen Wert in einer interpolierten Zeichenfolge zurückgibt. Im folgenden Beispiel wird das Ergebnis eines Ausdrucks in eine Zeichenfolge konvertiert und zu einer Ergebniszeichenfolge hinzugefügt, sobald ein Ausdruck berechnet wird:

double a = 3;
double b = 4;
Console.WriteLine($"Area of the right triangle with legs of {a} and {b} is {0.5 * a * b}");
Console.WriteLine($"Length of the hypotenuse of the right triangle with legs of {a} and {b} is {CalculateHypotenuse(a, b)}");
double CalculateHypotenuse(double leg1, double leg2) => Math.Sqrt(leg1 * leg1 + leg2 * leg2);
// Output:
// Area of the right triangle with legs of 3 and 4 is 6
// Length of the hypotenuse of the right triangle with legs of 3 and 4 is 5

Wie in dem Beispiel dargestellt, fügen Sie einen Ausdruck zu einer interpolierten Zeichenfolge hinzu, indem Sie diesen in Klammern setzen:

{<interpolationExpression>}

Interpolierte Zeichenfolgen unterstützen sämtliche Funktionen des Features kombinierte Formatierung von Zeichenfolgen. Damit stellen sie eine lesbarere Alternative zur Verwendung der String.Format-Methode dar.

Angeben einer Formatierungszeichenfolge für einen Interpolationsausdruck

Um eine Formatzeichenfolge anzugeben, die vom Typ des Ausdrucksergebnisses unterstützt wird, fügen Sie dem Interpolationsausdruck einen Doppelpunkt (:) und die Formatzeichenfolge an:

{<interpolationExpression>:<formatString>}

Im folgenden Beispiel wird veranschaulicht, wie Sie Standardformatzeichenfolgen und benutzerdefinierte Formatzeichenfolgen für Ausdrücke angeben, die Datums- oder Uhrzeitergebnisse bzw. numerische Ergebnisse ausgeben:

var date = new DateTime(1731, 11, 25);
Console.WriteLine($"On {date:dddd, MMMM dd, yyyy} L. Euler introduced the letter e to denote {Math.E:F5}.");
// Output:
// On Sunday, November 25, 1731 L. Euler introduced the letter e to denote 2.71828.

Weitere Informationen finden Sie im Artikel Kombinierte Formatierung im Abschnitt Formatzeichenfolgenkomponente.

Steuern der Feldbreite und -ausrichtung des formatierten Interpolationsausdrucks

Sie können die Mindestfeldbreite und die Ausrichtung für das formatierte Ausdrucksergebnis angeben, indem Sie dem Interpolationsausdruck ein Komma (,) und den konstanten Ausdruck anfügen:

{<interpolationExpression>,<alignment>}

Wenn der Wert der Ausrichtung positiv ist, wird das formatierte Ausdrucksergebnis rechtsbündig ausgerichtet. Ist der Wert negativ, wird das Ergebnis linksbündig ausgerichtet.

Wenn Sie sowohl die Ausrichtung als auch die Formatzeichenfolge angeben müssen, beginnen Sie mit der Ausrichtungskomponente:

{<interpolationExpression>,<alignment>:<formatString>}

Im folgenden Beispiel sehen Sie, wie Sie die Ausrichtung angeben. Es werden senkrechte Striche („|“) verwendet, um Textfelder zu begrenzen:

const int NameAlignment = -9;
const int ValueAlignment = 7;
double a = 3;
double b = 4;
Console.WriteLine($"Three classical Pythagorean means of {a} and {b}:");
Console.WriteLine($"|{"Arithmetic",NameAlignment}|{0.5 * (a + b),ValueAlignment:F3}|");
Console.WriteLine($"|{"Geometric",NameAlignment}|{Math.Sqrt(a * b),ValueAlignment:F3}|");
Console.WriteLine($"|{"Harmonic",NameAlignment}|{2 / (1 / a + 1 / b),ValueAlignment:F3}|");
// Output:
// Three classical Pythagorean means of 3 and 4:
// |Arithmetic|  3.500|
// |Geometric|  3.464|
// |Harmonic |  3.429|

Wie Sie in der Beispielausgabe sehen können, wird der Wert Ausrichtung ignoriert, wenn die Länge des formatierten Ausdrucksergebnisses über die angegebene Feldbreite hinausgeht.

Weitere Informationen finden Sie im Artikel Kombinierte Formatierung im Abschnitt Ausrichtungskomponente.

Verwenden von Escapesequenzen in einer interpolierten Zeichenfolge

Interpolierte Zeichenfolgen unterstützen alle Escapesequenzen, die in gewöhnlichen Zeichenfolgenliteralen verwendet werden können. Weitere Informationen finden Sie unter Zeichenfolgenescapesequenzen.

Verwenden Sie ein ausführliches Zeichenfolgenliteral, um Escapesequenzen wörtlich zu interpretieren. Eine interpolierte ausführliche Zeichenfolge beginnt mit den Zeichen $ und @. Sie können $ und @ in beliebiger Reihenfolge verwenden: Sowohl $@"..." als auch @$"..." sind gültige interpolierte ausführliche Zeichenfolgen.

Wenn Sie einer Ergebniszeichenfolge eine Klammer hinzufügen möchten „{“ oder „}“, sollten Sie jeweils zwei Klammern verwenden: „{{“ oder „}}“. Weitere Informationen finden Sie im Artikel Kombinierte Formatierung im Abschnitt Versehen von geschweiften Klammern mit Escapezeichen.

Im folgenden Beispiel wird dargestellt, wie Sie Klammern zu einer Ergebniszeichenfolge hinzufügen und eine ausführliche interpolierte Zeichenfolge erstellen:

var xs = new int[] { 1, 2, 7, 9 };
var ys = new int[] { 7, 9, 12 };
Console.WriteLine($"Find the intersection of the {{{string.Join(", ",xs)}}} and {{{string.Join(", ",ys)}}} sets.");
// Output:
// Find the intersection of the {1, 2, 7, 9} and {7, 9, 12} sets.

var userName = "Jane";
var stringWithEscapes = $"C:\\Users\\{userName}\\Documents";
var verbatimInterpolated = $@"C:\Users\{userName}\Documents";
Console.WriteLine(stringWithEscapes);
Console.WriteLine(verbatimInterpolated);
// Output:
// C:\Users\Jane\Documents
// C:\Users\Jane\Documents

Ab C# 11 können Sie interpolierte Rohzeichenfolgenliterale verwenden.

Verwenden eines ternären bedingten ?:-Operators in einem Interpolationsausdruck

Da der Doppelpunkt (:) in einem Element mit einem Interpolationsausdruck eine besondere Funktion einnimmt, müssen Sie diesen Ausdruck wie folgt in runde Klammern einschließen, um einen Bedingungsoperator verwenden zu können:

var rand = new Random();
for (int i = 0; i < 7; i++)
{
    Console.WriteLine($"Coin flip: {(rand.NextDouble() < 0.5 ? "heads" : "tails")}");
}

Erstellen einer kulturspezifischen Ergebniszeichenfolge mit einer Zeichenfolgeninterpolation

Standardmäßig verwendet eine interpolierte Zeichenfolge die aktuelle Kultur, die von der CultureInfo.CurrentCulture-Eigenschaft für alle Formatierungsvorgänge definiert ist.

Ab .NET 6 können Sie eine interpolierte Zeichenfolge mithilfe der String.Create(IFormatProvider, DefaultInterpolatedStringHandler)-Methode in eine kulturspezifische Ergebniszeichenfolge auflösen, wie im folgenden Beispiel gezeigt:

var cultures = new System.Globalization.CultureInfo[]
{
    System.Globalization.CultureInfo.GetCultureInfo("en-US"),
    System.Globalization.CultureInfo.GetCultureInfo("en-GB"),
    System.Globalization.CultureInfo.GetCultureInfo("nl-NL"),
    System.Globalization.CultureInfo.InvariantCulture
};
var date = DateTime.Now;
var number = 31_415_926.536;
foreach (var culture in cultures)
{
    var cultureSpecificMessage = string.Create(culture, $"{date,23}{number,20:N3}");
    Console.WriteLine($"{culture.Name,-10}{cultureSpecificMessage}");
}
// Output is similar to:
// en-US       8/27/2023 12:35:31 PM      31,415,926.536
// en-GB         27/08/2023 12:35:31      31,415,926.536
// nl-NL         27-08-2023 12:35:31      31.415.926,536
//               08/27/2023 12:35:31      31,415,926.536

Verwenden Sie in früheren Versionen von .NET die implizite Konvertierung einer interpolierten Zeichenfolge in eine System.FormattableString-Instanz, und rufen Sie deren ToString(IFormatProvider)-Methode auf, um eine kulturspezifische Ergebniszeichenfolge zu erstellen. Das folgende Beispiel zeigt, wie Sie dabei vorgehen müssen:

var cultures = new System.Globalization.CultureInfo[]
{
    System.Globalization.CultureInfo.GetCultureInfo("en-US"),
    System.Globalization.CultureInfo.GetCultureInfo("en-GB"),
    System.Globalization.CultureInfo.GetCultureInfo("nl-NL"),
    System.Globalization.CultureInfo.InvariantCulture
};
var date = DateTime.Now;
var number = 31_415_926.536;
FormattableString message = $"{date,23}{number,20:N3}";
foreach (var culture in cultures)
{
    var cultureSpecificMessage = message.ToString(culture);
    Console.WriteLine($"{culture.Name,-10}{cultureSpecificMessage}");
}
// Output is similar to:
// en-US       8/27/2023 12:35:31 PM      31,415,926.536
// en-GB         27/08/2023 12:35:31      31,415,926.536
// nl-NL         27-08-2023 12:35:31      31.415.926,536
//               08/27/2023 12:35:31      31,415,926.536

Wie in dem Beispiel dargestellt, können Sie eine FormattableString-Instanz verwenden, um mehrere Ergebniszeichenfolgen für verschiedene Kulturen zu generieren.

Erstellen einer Ergebniszeichenfolge mithilfe der invarianten Kultur

Verwenden Sie ab .NET 6 die String.Create(IFormatProvider, DefaultInterpolatedStringHandler)-Methode, um eine interpolierte Zeichenfolge in eine Ergebniszeichenfolge für InvariantCulture aufzulösen, wie im folgenden Beispiel gezeigt:

string message = string.Create(CultureInfo.InvariantCulture, $"Date and time in invariant culture: {DateTime.Now}");
Console.WriteLine(message);
// Output is similar to:
// Date and time in invariant culture: 05/17/2018 15:46:24

In früheren Versionen von .NET können Sie neben der FormattableString.ToString(IFormatProvider)-Methode die statische FormattableString.Invariant-Methode verwenden, wie das folgende Beispiel zeigt:

string message = FormattableString.Invariant($"Date and time in invariant culture: {DateTime.Now}");
Console.WriteLine(message);
// Output is similar to:
// Date and time in invariant culture: 05/17/2018 15:46:24

Schlussbemerkung

In diesem Tutorial wurden häufig auftretende Szenarios zur Verwendung der Zeichenfolgeninterpolation beschrieben. Weitere Informationen zur Zeichenfolgeninterpolation finden Sie unter Zeichenfolgeninterpolation. Weitere Informationen zum Formatieren von Typen in .NET finden Sie in den Artikeln Formatieren von Typen in .NET und Kombinierte Formatierung.

Siehe auch