A distanza di qualche mese dalla pubblicazione analizziamo alcune delle novità in C# 7.1.
C# 7.1 è stato pubblicato con l’upgrade 15.3 di Visual Studio 2017 (Agosto 2017). A differenza di altri rilasci, non tutte le novità sono disponibili automaticamente dopo l’aggiornamento, ma è necessario modificare manualmente la configurazione di Visual Studio. E’ possibile abilitare le nuove features del linguaggio dalla scheda Avanzate presente nelle proprietà di Compilazione del progetto.
Per impostazione predefinita Visual studio utilizza l’ultima major version: per poter abilitare le novità degli ultimi rilasci è necessario impostare latest minor version.
Nel seguito di questo articolo vedremo alcune delle novità di C# 7.1.
Async Main
La prima novità riguarda la possibilità di utilizzare codice sincrono all’interno di applicazioni Console. Il metodo main ha subito una sostanziale modifica, prima le sue firme erano:
public static void Main(); public static int Main(); public static void Main(string[] args); public static int Main(string[] args);
Con l’aggiornamento sono state introdotte anche le seguenti firme:
public static Task Main(); public static Task<int> Main(); public static Task Main(string[] args); public static Task<int> Main(string[] args);
Non è più necessario richiamare un metodo asincrono dal metodo main, ma è possibile utilizzare direttamente async ed await all’interno del metodo Main.
Default Literal Expressions
Utilizzando la keyword default è possibile assegnare ad una variabile il valore di default del suo tipo.
int numeric = default(int); Object reference = default(Object); DateTime value = default(DateTime);
In C# 7.1, quando è possibile determinare il tipo di variabile (ad esempio quando stiamo utilizzando una variabile con var), è possibile semplificare la sintassi nel seguente modo:
int numeric = default; Object reference = default; DateTime value = default; T defaultValue = default;
Il valore di default di un tipo può essere utilizzato come valore di ritorno da una funzione, come valore di default per un parametro opzionale e come valore per i parametri di un metodo.
Inferred Tuple Element Names
Il concetto di Tupla è stato introdotto in C# a partire dalla versione 7.0. Nella defizione di una tupla l’accesso ai suoi elementi può avvenire utilizzando Item1, Item2, ecc…
var coords2 = (x, y); var x2 = coords2.Item1;
L’alternativa può essere quella di specificare il nome in fase di defizione della tupla:
var coords1 = (x: x, y: y); var x1 = coords1.x;
In C# 7.1 è stata introdotta la possibilità di recuperare il valore dell’oggetto direttamente dal suo nome:
var coords2 = (x, y); var x2 = coords2.x;
Generic Pattern Matching
Dalla versione 7.0 è possibile utilizzare la keyword is per confrontare i tipi. Non era però possibile effettuare confronti in presenza di metodi generici. Ora è possibile scrivere codice del tipo:
static string Print<T>(T input)
{
switch(input)
{
case int i:
return "int";
case string s:
return "string";
default:
return "unknown";
}
}