In C# 7.0 sono presenti alcune funzionalità che consentono di semplificare la scrittura del codice, rendendo molto più semplice la sua lettura.
In particolare sono state introdotti i metodo expression bodied e throw expression.
Possiamo utilizzare le Expression bodied :
- nei metodi
- nelle properties
- nei costruttori
- nei distruttori
- nelle throw exception
Le expression bodied utilizzano l’operatore “fat arrow” (=>) per definire il codice da eseguire.
Expression Bodied nei Metodi
Introdotte a partire dalla versione 6.0, le expression bodies sono state aggiornate per supportare membri expression bodied con costruttori, decostruttori e proprietà.
I metodo expression-bodied consentono di semplificare notevolmente la scrittura di codice. Supponiamo di avere un metodo che ha al suo interno un solo statement, in C# 5.0 avremmo scritto :
public bool IsSquare(Rectangle rect)
{
return rect.Height == rect.Width;
}
A partire dalla versione 6.0 possiamo sostituire il metodo con un’espressione lambda del tipo:
public bool IsSquare(Rectangle rect) => rect.Height == rect.Width;
Lo stesso tipo di semplifcazione può essere utilizzata per ottenere il valore di una proprietà. L’equivalente codice scritto in C# 5 :
public string FullName
{
get
{
return FirstName + " " + LastName;
}
}
può essere semplificato nel seguente modo:
public string FullName => FirstName + " " + LastName;
Le espressioni lambda possono essere scritte in forma abbreviata quando i suoi statement sono composti da una solo riga
Con C# 7.0 le funzionalità delle Expression Bodied sono state estese con la possibilità di utilizzare i costruttori direttamente inline. Il codice scritto in C# 6 ( in cui il metodo Resource stampa a video il valore restituito dalla funzione nameOf
public Resource()
{
Console.WriteLine($"ctor {nameof(Resource}");
}
può essere semplificato nel seguente modo:
public Resource() => Console.WriteLine($"ctor {nameof(Resource}");
Expression-Bodied nelle Properties
Le proprietà con il solo metodo get (quindi read-only) come quella nel codice seguente
//Read-only properties C#5
public string FullName
{
get
{
return FirstName + " " + LastName;
}
}
possono essere semplificate in una singola riga di codice utilizzando un’expression-bodied:
public string FullName => FirstName + " " + LastName;
Expression Bodied nei Costruttori e nei Distruttori
Nel caso in cui il costruttore abbia un solo statement può essere semplificato e riscritto mediante Expression Bodied. Il codice:
public Resource()
{
Console.WriteLine($"ctor {nameof(Resource}");
}
diventa:
Resource() => Console.WriteLine($"ctor {nameof(Resource}");
Analogamente ai costruttori le espression bodied possono essere utilizzate per semplificare i distruttori. Il distruttore:
public ~Resource()
{
Console.WriteLine($"destructor {nameof(Resource}");
}
può essere semplificato nella seguente istruzione in-line
public ~Resource() => Console.WriteLine($"destructor {nameof(Resource}");
Expression Bodied – throw exceptions
In C# 7.0 è possibile semplifcare un metodo in maniera compatta. Il seguente codice può essere, ad esempio, semplificato
public string GetPhoneNumber ()
{
return "867-5309";
}
nel seguente
public string GetPhoneNumber () => "867-5309
Sviluppando mockup di metodi si ha spesso la necessità di creare metodi incompleti, o che generano un’eccezione per indicare che non sono ancora stati implementati. La prima soluzione può essere quella di restituire null oppure nel caso di stringhe una stringa vuota.
public string GetPhoneNumber () => return null; //or String.Empty
Questa soluzione non è necessariamente la migliore perchè potrebbe generare falsi risultati e/o comportamenti non desiderati. Introducendo le expression bodied è possibile evitare questo tipo di problematica, creando un metodo che ritorna un’eccezione:
public string GetPhoneNumber () => throw new NotImplementedException();
inserendo il throw direttamente all’interno del body del metodo.