Interpolazione di stringhe in C#
Questa esercitazione illustra come usare l'interpolazione di stringhe per formattare e includere risultati di espressione in una stringa di risultato. Gli esempi presuppongono una buona familiarità con i concetti di base del linguaggio C# e con la formattazione dei tipi in .NET. Se non si ha familiarità con l'interpolazione di stringhe o con la formattazione dei tipi in .NET, vedere prima l'esercitazione interattiva sull'interpolazione di stringhe. Per altre informazioni sulla formattazione dei tipi in .NET, vedere Formattazione dei tipi in .NET.
Introduzione
Per identificare un valore letterale stringa come stringa interpolata, anteporre a questa il simbolo $
. È possibile incorporare in una stringa interpolata qualsiasi espressione C# valida che restituisca un valore. Nell'esempio seguente, non appena un'espressione viene valutata, il suo risultato viene convertito in una stringa e incluso in una stringa di risultato:
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
Come illustrato nell'esempio, per includere un'espressione in una stringa interpolata è necessario racchiuderla tra parentesi graffe:
{<interpolationExpression>}
Le stringhe interpolate supportano tutte le caratteristiche della funzionalità di formattazione composita delle stringhe, che li rende un'alternativa più leggibile all'uso del metodo String.Format.
Come specificare una stringa di formato per un'espressione di interpolazione
Per specificare una stringa di formato supportata dal tipo del risultato dell'espressione, seguire l'espressione di interpolazione con due punti (":") e la stringa di formato:
{<interpolationExpression>:<formatString>}
L'esempio seguente illustra come specificare stringhe di formato standard e personalizzate per espressioni che producono risultati di tipo data e ora o numerici:
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.
Per altre informazioni, vedere la sezione Formattare il componente stringa dell'articolo Formattazione composita .
Come controllare la larghezza del campo e l'allineamento delle espressioni di interpolazione formattate
Per specificare la larghezza minima del campo e l'allineamento del risultato dell'espressione formattata, seguire l'espressione di interpolazione con una virgola (",") e l'espressione costante:
{<interpolationExpression>,<alignment>}
Se il valore alignment è positivo, il risultato dell'espressione formattata è allineato a destra, mentre se è negativo è allineato a sinistra.
Se è necessario specificare sia l'allineamento che una stringa di formato, iniziare con l'allineamento:
{<interpolationExpression>,<alignment>:<formatString>}
L'esempio seguente illustra come specificare l'allineamento e usa caratteri barra verticale ("|") per delimitare i campi di testo:
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|
Come illustrato nell'esempio di output, se la lunghezza del risultato dell'espressione formattata supera la larghezza del campo specificata, il valore alignment viene ignorato.
Per altre informazioni, vedere la sezione Componente allineamento dell'articolo Formattazione composita .
Come usare sequenze di escape in una stringa interpolata
Le stringhe interpolate supportano tutte le sequenze di escape che è possibile usare all'interno di valori letterali stringa normali. Per altre informazioni, vedere Sequenze di escape delle stringhe.
Per interpretare le sequenze di escape letteralmente, usare un valore letterale stringa verbatim. Una stringa verbatim interpolata inizia con i $
caratteri e @
. È possibile usare $
e @
in qualsiasi ordine: sia $@"..."
che @$"..."
sono stringhe verbatim interpolate valide.
Per includere una parentesi graffa, "{" o "}", in una stringa di risultato, usare due parentesi graffe, "{{" o "}}". Per altre informazioni, vedere la sezione Parentesi graffe di escape dell'articolo Formattazione composita .
L'esempio seguente illustra come includere parentesi graffe in una stringa di risultato e costruire una stringa interpolata verbatim:
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
A partire da C# 11, è possibile usare valori letterali stringa non elaborati interpolati.
Come usare un operatore condizionale ternario ?:
in un'espressione di interpolazione
Dato che i due punti (":") hanno un significato speciale in un elemento con un'espressione di interpolazione, per usare un operatore condizionale in un'espressione, racchiudere l'espressione tra parentesi, come illustrato dall'esempio seguente:
var rand = new Random();
for (int i = 0; i < 7; i++)
{
Console.WriteLine($"Coin flip: {(rand.NextDouble() < 0.5 ? "heads" : "tails")}");
}
Come creare una stringa di risultato specifica delle impostazioni cultura con interpolazione
Per impostazione predefinita, una stringa interpolata usa le impostazioni cultura correnti definite dalla proprietà CultureInfo.CurrentCulture per tutte le operazioni di formattazione.
A partire da .NET 6, è possibile usare il String.Create(IFormatProvider, DefaultInterpolatedStringHandler) metodo per risolvere una stringa interpolata in una stringa di risultato specifica delle impostazioni cultura, come illustrato nell'esempio seguente:
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
Nelle versioni precedenti di .NET usare la conversione implicita di una stringa interpolata in un'istanza System.FormattableString e chiamare il relativo ToString(IFormatProvider) metodo per creare una stringa di risultati specifica delle impostazioni cultura. L'esempio seguente illustra come eseguire questa operazione:
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
Come illustrato nell'esempio, è possibile usare un'istanza di FormattableString per generare più stringhe di risultato per diverse impostazioni cultura.
Come creare una stringa di risultato usando le impostazioni cultura inglese non dipendenti da paese/area geografica
A partire da .NET 6, usare il String.Create(IFormatProvider, DefaultInterpolatedStringHandler) metodo per risolvere una stringa interpolata in una stringa di risultato per InvariantCulture, come illustrato nell'esempio seguente:
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
Nelle versioni precedenti di .NET, insieme al FormattableString.ToString(IFormatProvider) metodo , è possibile usare il metodo statico FormattableString.Invariant , come illustrato nell'esempio seguente:
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
Conclusione
Questa esercitazione descrive scenari comuni di utilizzo dell'interpolazione di stringhe. Per altre informazioni sull'interpolazione di stringhe, vedere Interpolazione di stringhe. Per altre informazioni sulla formattazione dei tipi in .NET, vedere gli articoli Formattazione dei tipi in .NET e Formattazione composita .