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 la rubrique Mise en forme des types dans .NET.

Notes

Les exemples C# de cet article s’exécutent dans l’exécuteur et le terrain de jeu du code inline Try.NET. Sélectionnez le bouton Exécuter pour exécuter un exemple dans une fenêtre interactive. Une fois que vous avez exécuté le code, vous pouvez le modifier et exécuter le code modifié en resélectionnant Exécuter. La code modifié s’exécute dans la fenêtre interactive ou, si la compilation échoue, la fenêtre interactive affiche tous les messages d’erreur du compilateur C#.

Introduction

La fonctionnalité Interpolation de chaîne s’appuie sur la fonctionnalité Mise en forme composite et fournit une syntaxe plus lisible et plus pratique pour inclure des résultats d’expressions mises en forme dans une chaîne de résultat.

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);

// Expected 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

Vous spécifiez une chaîne de format prise en charge par le type du résultat d’expression en plaçant 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} Leonhard Euler introduced the letter e to denote {Math.E:F5} in a letter to Christian Goldbach.");

// Expected output:
// On Sunday, November 25, 1731 Leonhard Euler introduced the letter e to denote 2.71828 in a letter to Christian Goldbach.

Pour plus d’informations, consultez la section Composant de chaîne de format de la rubrique Mise en forme composite. Cette section fournit des liens vers les rubriques qui décrivent les chaînes de format standard et personnalisées prises en charge par les types de base .NET.

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

Vous spécifiez la largeur minimale du champ et l’alignement du résultat de l’expression mise en forme en plaçant 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}|");

// Expected 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 la rubrique 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 détaillée interpolée commence par le $ caractère suivi du @ caractère. Vous pouvez utiliser les jetons et @ les $ jetons dans n’importe quel ordre : les deux $@"..." et @$"..." sont des chaînes détaillées 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 Échappement des accolades de la rubrique 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.");

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

// Expected output:
// Find the intersection of the {1, 2, 7, 9} and {7, 9, 12} sets.
// C:\Users\Jane\Documents
// C:\Users\Jane\Documents

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. 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,20}{number,20:N3}";
foreach (var culture in cultures)
{
    var cultureSpecificMessage = message.ToString(culture);
    Console.WriteLine($"{culture.Name,-10}{cultureSpecificMessage}");
}

// Expected output is like:
// en-US       5/17/18 3:44:55 PM      31,415,926.536
// en-GB      17/05/2018 15:44:55      31,415,926.536
// nl-NL        17-05-18 15:44:55      31.415.926,536
//            05/17/2018 15:44:55      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

Avec la méthode FormattableString.ToString(IFormatProvider), vous pouvez utiliser la méthode statique FormattableString.Invariant pour résoudre une chaîne interpolée en une chaîne de résultat pour InvariantCulture. L’exemple suivant montre comment effectuer cette opération :

string messageInInvariantCulture = FormattableString.Invariant($"Date and time in invariant culture: {DateTime.Now}");
Console.WriteLine(messageInInvariantCulture);

// Expected output is like:
// 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 la rubrique Interpolation de chaîne. Pour plus d’informations sur la mise en forme des types dans .NET, consultez les rubriques Mise en forme des types dans .NET et Mise en forme composite.

Voir aussi