Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questa esercitazione illustra come usare l'interpolazione di stringhe per formattare e includere i risultati dell'espressione in una stringa di risultato. Gli esempi presuppongono che si abbia familiarità con i concetti di base di C# e la formattazione dei tipi .NET. 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 qualsiasi espressione C# valida che restituisce un valore in una stringa interpolata. Nell'esempio seguente, non appena viene valutata un'espressione, il 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, puoi includere un'espressione all'interno di una stringa interpolata racchiudendola fra parentesi graffe:
{<interpolationExpression>}
Le stringhe interpolate supportano tutte le funzionalità della funzionalità di formattazione composita delle stringhe . Ciò li rende un'alternativa più leggibile all'uso del String.Format metodo . Ogni stringa interpolata deve avere:
- Un valore letterale di stringa che inizia con il carattere
$
prima della virgoletta iniziale. Non possono essere presenti spazi tra il$
simbolo e il carattere virgolette. - Una o più espressioni di interpolazione. Un'espressione di interpolazione si indica con una parentesi graffa di apertura (
{
) e chiusura (}
). È possibile inserire qualsiasi espressione C# che restituisce un valore (inclusonull
) all'interno delle parentesi graffe.
C# valuta l'espressione tra i {
caratteri e }
con le regole seguenti:
- Se l'espressione di interpolazione restituisce
null
, viene usata una stringa vuota ("" o String.Empty). - Se l'espressione di interpolazione non restituisce
null
, in genere viene chiamato ilToString
metodo del tipo di risultato.
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 le espressioni che producono risultati di 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 Componente stringa di formato dell'articolo Formattazione composita.
Come controllare la larghezza e l'allineamento del campo dell'espressione di interpolazione formattata
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>,<width>}
L'esempio di codice seguente usa la larghezza minima del campo per creare un output tabulare:
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 |
Se il valore di larghezza è positivo, il risultato dell'espressione formattata è allineato a destra; se negativo, è allineato a sinistra. Rimuovere i segni prima dell'identificatore -
di larghezza ed eseguire di nuovo l'esempio per visualizzare i risultati.
Se è necessario specificare sia la larghezza che una stringa di formato, iniziare con il componente width:
{<interpolationExpression>,<width>:<formatString>}
Nell'esempio seguente viene illustrato come specificare la larghezza e l'allineamento e vengono utilizzati caratteri pipe ("|") 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'output di esempio, se la lunghezza del risultato dell'espressione formattata supera la larghezza del campo specificata, il valore di larghezza viene ignorato.
Per ulteriori informazioni, consulta la sezione Componente larghezza dell'articolo Formato composito.
Come usare sequenze di escape in una stringa interpolata
Le stringhe interpolate supportano tutte le sequenze di escape che possono essere usate in normali valori letterali stringa. Per altre informazioni, vedere Sequenze di escape di stringhe.
Per interpretare letteralmente le sequenze di escape, usare una stringa letterale 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 letterali di stringa grezzi interpolati.
Come usare un operatore ?:
condizionale ternario in un'espressione di interpolazione
Poiché i due punti (":") hanno un significato speciale in un elemento con un'espressione di interpolazione, per usare un operatore condizionale in un'espressione, racchiuderlo tra parentesi, come illustrato nell'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 alla cultura con interpolazione di stringhe
Per impostazione predefinita, una stringa interpolata usa la cultura corrente definita dalla proprietà CultureInfo.CurrentCulture per tutte le operazioni di formattazione.
A partire da .NET 6, è possibile usare il metodo String.Create(IFormatProvider, DefaultInterpolatedStringHandler) per risolvere una stringa interpolata in una stringa di risultato specifica del contesto culturale, 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, utilizzare la conversione implicita di una stringa interpolata in un'istanza System.FormattableString e chiamare il metodo ToString(IFormatProvider) per creare una stringa di risultato specifica per la 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 FormattableString per generare più stringhe di risultato per diverse culture.
Come creare una stringa dei risultati usando la cultura invariabile
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 .