TOC

This article has been localized into Italian by the community.

Operatori:

L'operatore di interpolazione di stringhe

Altrove in questo tutorial, trovate una estesa descrizione del tipo di dato stringa, perché la gestione del testo è un'attività molto importante. In questo articolo ci focalizziamo su un operatore speciale per lavorare con le stringhe, il quale permette di fare alcuni trucchetti extra durante la dichiarazione delle stringhe. È chiamato interpolazione di strighe (introdotto in C# 6.0) e permette di piazzare marcatori speciali nella stringa, che l'interprete sostituirà poi con i valori pertinenti. Funziona in modo molto simile al metodo String.Format() che abbiamo già discusso, ma la sintassi è più leggibile e comoda.

L'interpolazione di stringhe si può ottenere molto facilmente. Basta anteporre il carattere $ alla stringa. Come sempre, andiamo diretti ad un esempio:

string name = "John Doe";
int age = 42;

Console.WriteLine(name + " is " + age + " years old");
Console.WriteLine($"{name} is {age} years old");

Nelle ultime due linee facciamo esattamente la stessa cosa: prima in modo tradizionale, dove concateniamo una stringa con le due variabili, e poi usando l'interpolazione di stringhe. Notiamo come ci permetta di inserire variabili direttamente nella stringa, iscrivendole tra parentesi graffe. E anche se questo avviene all'interno di una stringa, il compilatore verifica comunque le variabili che cerchiamo di inserire!

Tra l'altro, le variabili non devono essere dei tipi semplici. Si possono usare anche proprietà da oggetti complessi, proprio come se stessimo usando la concatenazione di stringhe. Ecco un esempio:

var user = new
{
    Name = "John Doe",
    Age = 42
};
Console.WriteLine($"{user.Name} is {user.Age} years old");

Stringhe di formattazione

Per impostazione predefinita, le variabili incluse vengono trasformate nella relativa rappresentazione di stringa con una chiamata al metodo ToString(). Ma a volte si vuole un po' più di controllo sul modo in cui ogni variabile viene mostrata, e, fortunatamente, questo è molto semplice da fare, grazie alle stringhe di formattazione. Vanno semplicemente messi due punti (:) dopo la variabile e poi inserire un formato stringa da usare, come in questo esempio:

double daysSinceMillenium = (DateTime.Now - new DateTime(2000, 1, 1)).TotalDays;  
Console.WriteLine($"Today is {DateTime.Now:d} and {daysSinceMillenium:N2} days have passed since the last millennium!");

Il risultato sarà simile a questo, in base alle vostre impostazioni di sistema per date e numeri:

Today is Friday, June 29, 2018 and 6,754.49 days have passed since the last millenium!

Da notare come la data è rappresentata nel formato data lunga (come specificato con il formato stringa "D") e il numero è formattato con separatore delle migliaia e due numeri decimali, grazie al formato stringa numerico "N2".

Se si vuole ancora più controllo, si può passare dal formato stringa predefinito ai formati personalizzati, ad esempio per le date:

Console.WriteLine($"Today is {DateTime.Now:yyyy-MM-dd}");

Ci sono molti altri modi di formattare un DateTime che si possono usare in una stringa interpolata. Per tutte le opzioni, vi invitiamo a consultare la documentazione.

Oltre le variabili

Ora, abbiamo incluso variabili e anche proprietà di oggetti nelle stringhe ed abbiamo visto quanto sia facile formattare la stringa risultante. Ma l'interpolazione di stringhe va oltre tutto ciò, perché si possono avere intere espressioni in C# dentro le stringhe, fintanto che risultino in qualcosa che si può appendere ad una stringa. Un grande esempio di questo è la classica situazione "nome al singolare o al plurale" dove si deve creare una stringa che sia "di 1 anno" oppure "di 2 anni" (NdT: nell'esempio in inglese, l'aggiunta di una -s finale: "1 year" o "2 years") . Si può fare direttamente con l'interpolazione di stringhe, semplicemente usando l'operatore ternario dentro la stringa:

string name = "John Doe";
int age = 42;

Console.WriteLine($"{name} is {age} year{(age == 1 ? "" : "s")} old");

Da notare come abbiamo inserito una semplice espressione if-then-else dentro la stringa, all'interno di parentesi. Possiamo farlo perché il risultato dell'espressione è una stringa, vuota o con una "s". Si possono anche fare operazioni matematiche:

Console.WriteLine($"5 + 5 * 2 = {((5 + 5) * 2)}");

Di nuovo, finché il risultato di un'espressione può essere convertito in una stringa, si può usare all'interno della stringa interpolata.

Interpolazione di stringhe & Escape

Dopo un po' che si lavora con l'interpolazione di stringhe, verrà in mente una domanda molto ovvia: come si possono includere caratteri che hanno un significato speciale, ad esempio le parentesi graffe, per renderle in senso letterale? La risposta di solito è l'escape, il fatto di anteporre/posporre un'altro carattere al carattere speciale, per ignorare il suo significato speciale. Questo è vero anche per l'interpolazione, dove le parentesi graffe devono essere scritte due volte per essere trattate letteralmente, in questo modo:

Console.WriteLine($"Insert {name} between curly braces: {{name here}}");

Il risultato:

Insert John Doe between curly braces: {name here}

Riepilogo

Se avete mai guardato alla concatenazione di stringhe classica pensando che fosse troppo sgraziata, vi entusiasmerà l'interpolazione di stringhe! È stata introdotta in C# versione 6.0 e permette di scrivere testo che include variabili in modo naturale e comprensibile. Sono anche fantastiche perché permettono di integrare espressioni direttamente nelle stringhe, ma con attenzione: ad un certo punto, la stringa interpolata potrebbe diventare così complessa da risultare di difficile lettura rispetto alle alternative.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!