Interpolation de chaîne en C#

Ce tutoriel vous montre comment utiliser une interpolation de chaîne pour mettre en forme et inclure des résultats d’expressions dans une chaîne de résultat. Les exemples supposent que vous êtes familiarisé avec les concepts de base de C# et la mise en forme des types .NET. Si vous ne connaissez pas l’interpolation de chaînes ou la mise en forme de types .NET, consultez d’abord le tutoriel interactif sur l’interpolation de chaînes. Pour plus d’informations sur la mise en forme des types dans .NET, consultez Mise en forme des types dans .NET.

Présentation

Pour identifier un littéral de chaîne comme chaîne interpolée, préfixez-la du symbole $. Vous pouvez incorporer n’importe quelle expression C# valide qui retourne une valeur dans une chaîne interpolée. Dans l’exemple suivant, dès qu’une expression est évaluée, son résultat est converti en chaîne et est inclus dans une chaîne de résultat :

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

Comme le montre l’exemple, vous incluez une expression dans une chaîne interpolée en la plaçant entre des accolades :

{<interpolationExpression>}

Les chaînes interpolées prennent en charge toutes les fonctions de la fonctionnalité Mise en forme de chaîne composite. Elles constituent ainsi une alternative plus lisible à l’utilisation de la méthode String.Format.

Comment spécifier une chaîne de format pour une expression d’interpolation

Pour spécifier une chaîne de format prise en charge par le type du résultat d’expression, placez un signe deux-points (« : ») et la chaîne de format après l’expression d’interpolation :

{<interpolationExpression>:<formatString>}

L’exemple suivant montre comment spécifier des chaînes de format standard et personnalisées pour des expressions qui produisent des résultats de type date/heure ou numérique :

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.

Pour plus d’informations, consultez la section Composant de chaîne de format de l’article Mise en forme composite.

Comment contrôler la largeur de champ et l’alignement de l’expression d’interpolation mise en forme

Pour spécifier la largeur minimale du champ et l’alignement du résultat de l’expression mise en forme, placez une virgule (« , ») et l’expression constante après l’expression d’interpolation :

{<interpolationExpression>,<alignment>}

Si la valeur de l’alignement est positive, le résultat de l’expression mise en forme est aligné à droite ; si la valeur est négative, il est aligné à gauche.

Si vous devez spécifier à la fois un alignement et une chaîne de format, commencez par le composant d’alignement :

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

L’exemple suivant montre comment spécifier l’alignement ; il utilise des caractères de barre verticale (« | ») pour délimiter les champs texte :

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|

Comme le montre l’exemple de sortie, si la longueur du résultat d’expression mise en forme dépasse la largeur de champ spécifiée, la valeur de l’alignement est ignorée.

Pour plus d’informations, consultez la section Composant d’alignement de l’article Mise en forme composite.

Comment utiliser des séquences d’échappement dans une chaîne interpolée

Les chaînes interpolées prennent en charge toutes les séquences d’échappement qui peuvent être utilisés dans les littéraux de chaîne ordinaires. Pour plus d’informations, consultez Séquences d’échappement de chaîne.

Pour interpréter les séquences d’échappement littéralement, utilisez un littéral de chaîne textuelle. Une chaîne verbatim interpolée commence par les caractères $ et @. Vous pouvez utiliser $ et @ dans n’importe quel ordre : $@"..." et @$"..." sont toutes deux des chaînes verbatim interpolées valides.

Pour inclure une accolade, « { » ou «} », dans une chaîne de résultat, utilisez deux accolades, « {{ » ou «}} ». Pour plus d’informations, consultez la section Accolades d’échappement de l’article Mise en forme composite.

L’exemple suivant montre comment inclure des accolades dans une chaîne de résultat et construire une chaîne interpolée textuelle :

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

À compter de C# 11, vous pouvez utiliser des littéraux de chaîne brute interpolés.

Comment utiliser un opérateur conditionnel ternaire ?: dans une expression d’interpolation

Comme le caractère deux-points (« : ») a une signification spéciale dans un élément avec une expression d’interpolation, pour utiliser un opérateur conditionnel dans une expression, placez-la entre parenthèses, comme le montre l’exemple suivant :

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

Comment créer une chaîne de résultat spécifique à une culture avec une interpolation de chaîne

Par défaut, une chaîne interpolée utilise la culture active définie par la propriété CultureInfo.CurrentCulture pour toutes les opérations de mise en forme.

À compter de .NET 6, vous pouvez utiliser la méthode String.Create(IFormatProvider, DefaultInterpolatedStringHandler) pour résoudre une chaîne interpolée en chaîne de résultat spécifique à la culture, comme l’illustre l’exemple suivant :

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

Dans les versions antérieures de .NET, utilisez la conversion implicite d’une chaîne interpolée en une instance de System.FormattableString et appelez sa méthode ToString(IFormatProvider) pour créer une chaîne de résultat spécifique à une culture. L’exemple suivant montre comment effectuer cette opération :

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

Comme le montre l’exemple, vous pouvez utiliser une même instance de FormattableString pour générer plusieurs chaînes de résultat pour différentes cultures.

Comment créer une chaîne de résultat avec la culture invariante

À compter de .NET 6, utilisez la méthode String.Create(IFormatProvider, DefaultInterpolatedStringHandler) pour résoudre une chaîne interpolée en chaîne de résultat pour le InvariantCulture, comme l’illustre l’exemple suivant :

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

Dans les versions antérieures de .NET, ainsi qu’avec la méthode FormattableString.ToString(IFormatProvider), vous pouvez utiliser la méthode FormattableString.Invariant statique, comme l’illustre l’exemple suivant :

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

Conclusion

Ce tutoriel décrit des scénarios courants d’utilisation de l’interpolation de chaîne. Pour plus d’informations sur l’interpolation de chaîne, consultez Interpolation de chaîne. Pour plus d’informations sur la mise en forme des types dans .NET, consultez les articles Mise en forme des types dans .NET et Mise en forme composite.

Voir aussi