Freigeben über


Zeichenfolgeninterpolation in C#

In diesem Lernprogramm erfahren Sie, wie Sie die Zeichenfolgeninterpolation zum Formatieren und Einschließen von Ausdrucksergebnissen in eine Ergebniszeichenfolge verwenden. In den Beispielen wird davon ausgegangen, dass Sie mit grundlegenden C#-Konzepten und .NET-Typformatierungen vertraut sind. Weitere Informationen zu Formatierungstypen in .NET finden Sie unter Formatierungstypen in .NET.

Einleitung

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, sobald ein Ausdruck ausgewertet wird, in eine Zeichenfolge konvertiert und in eine Ergebniszeichenfolge eingeschlossen:

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 das Beispiel zeigt, fügen Sie einen Ausdruck in eine interpolierte Zeichenfolge ein, indem Sie ihn in geschweifte Klammern einschließen:

{<interpolationExpression>}

Interpolierte Zeichenfolgen unterstützen alle Funktionen des Features für zusammengesetzte Zeichenfolgenformatierung . Dies macht sie zu einer besser lesbaren Alternative zur Verwendung der String.Format Methode. Jede interpolierte Zeichenfolge muss folgendes aufweisen:

  • Ein Zeichenfolgenliteral, das mit dem $ Zeichen vor dem öffnenden Anführungszeichen beginnt. Zwischen dem $ Symbol und dem Anführungszeichen können keine Leerzeichen vorhanden sein.
  • Einer oder mehrere Interpolationsausdrücke. Sie kennzeichnen einen Interpolationsausdruck durch eine öffnende und schließende geschweifte Klammer ({ und }). Sie können einen beliebigen C#-Ausdruck einfügen, der einen Wert (einschließlich null) innerhalb der geschweiften Klammern zurückgibt.

C# wertet den Ausdruck zwischen { und } Zeichen nach den folgenden Regeln aus.

  • Wenn der Interpolationsausdruck zu null ausgewertet wird, wird eine leere Zeichenfolge ("" oder String.Empty) verwendet.
  • Wenn der Interpolationsausdruck nicht zu null ausgewertet wird, wird normalerweise die Methode ToString des Ergebnistyps aufgerufen.

Wie man eine Formatzeichenfolge für einen Interpolationsausdruck angibt

Um eine Formatzeichenfolge anzugeben, die vom Typ des Ausdrucksergebnisses unterstützt wird, folgen Sie dem Interpolationsausdruck mit einem Doppelpunkt (":") und der Formatzeichenfolge:

{<interpolationExpression>:<formatString>}

Das folgende Beispiel zeigt, wie Standard- und benutzerdefinierte Formatzeichenfolgen für Ausdrücke angegeben werden, die Datums- und Uhrzeit- oder numerische Ergebnisse erzeugen:

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

Um die Mindestfeldbreite und die Ausrichtung des formatierten Ausdrucksergebnisses anzugeben, folgen Sie dem Interpolationsausdruck mit einem Komma (",") und dem Konstantenausdruck:

{<interpolationExpression>,<width>}

Im folgenden Codebeispiel wird die minimale Feldbreite verwendet, um eine tabellarische Ausgabe zu erstellen:

var titles = new Dictionary<string, string>()
{
    ["Doyle, Arthur Conan"] = "Hound of the Baskervilles, The",
    ["London, Jack"] = "Call of the Wild, The",
    ["Shakespeare, William"] = "Tempest, The"
};

Console.WriteLine("Author and Title List");
Console.WriteLine();
Console.WriteLine($"|{"Author",-25}|{"Title",30}|");
foreach (var title in titles)
{
    Console.WriteLine($"|{title.Key,-25}|{title.Value,30}|");
}
// Output:
// Author and Title List
// 
// |Author                   |Title                          |
// |Doyle, Arthur Conan      |Hound of the Baskervilles, The |
// |London, Jack             |         Call of the Wild, The |
// |Shakespeare, William     |                  Tempest, The |

Wenn der Breiteswert positiv ist, wird das formatierte Ausdrucksergebnis rechtsbündig ausgerichtet. wenn negativ, wird sie linksbündig ausgerichtet. Entfernen Sie die - Zeichen vor dem Breitenbezeichner, und führen Sie das Beispiel erneut aus, um die Ergebnisse anzuzeigen.

Wenn Sie sowohl die Breite als auch eine Formatzeichenfolge angeben müssen, beginnen Sie mit der Width-Komponente:

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

Das folgende Beispiel zeigt, wie Breite und Ausrichtung angegeben werden, und es werden Pipezeichen ("|") verwendet, um Textfelder zu trennen:

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 die Beispielausgabe zeigt, wird der Breiteswert ignoriert, wenn die Länge des formatierten Ausdrucksergebnisses die angegebene Feldbreite überschreitet.

Weitere Informationen finden Sie im Abschnitt Breitenkomponente des Artikels Zusammengesetzte Formatierung .

Wie man Escapesequenzen in einer interpolierten Zeichenfolge verwendet

Alle Escape-Sequenzen, die in normalen Zeichenfolgenliteralen verwendet werden können, werden auch von interpolierten Zeichenfolgen unterstützt. Weitere Informationen finden Sie unter Zeichenfolgen-Escapesequenzen.

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

Um eine geschweifte Klammer, "{" oder "}", in eine Ergebniszeichenfolge einzuschließen, verwenden Sie zwei geschweifte Klammern, "{{" oder "}}". Weitere Informationen finden Sie im Artikel Kombinierte Formatierung im Abschnitt Versehen von geschweiften Klammern mit Escapezeichen.

Das folgende Beispiel zeigt, wie geschweifte Klammern in eine Ergebniszeichenfolge eingeschlossen und eine wörtliche interpolierte Zeichenfolge erstellt wird:

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 Bedeutung hat, um einen bedingten Operator in einem Ausdruck zu verwenden, schließen Sie ihn in Klammern ein, wie das folgende Beispiel zeigt:

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

Erstellen einer ergebnisspezifischen Zeichenfolge für eine bestimmte Kultur durch 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 die String.Create(IFormatProvider, DefaultInterpolatedStringHandler) Methode verwenden, um eine interpolierte Zeichenfolge in eine kulturspezifische Ergebniszeichenfolge aufzulösen, wie das folgende Beispiel zeigt:

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 die 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 das Beispiel zeigt, können Sie eine FormattableString Instanz verwenden, um mehrere Ergebniszeichenfolgen für verschiedene Kulturen zu generieren.

So erstellen Sie eine 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 die InvariantCultureZeichenfolge 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 zusammen mit 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

Schlussfolgerung

In diesem Tutorial werden allgemeine Szenarien der Verwendung der Zeichenfolgeninterpolation beschrieben. Weitere Informationen zur Zeichenfolgeninterpolation finden Sie unter Zeichenfolgeninterpolation. Weitere Informationen zu Formatierungstypen in .NET finden Sie in den Formatierungstypen in .NET - und Composite-Formatierungsartikeln .

Siehe auch