Ogni nuova versione di Visual Studio porta con sè [solitamente] una nuova versione di C#; la 2015 non è da meno, visto che introduce C# 6.0.
Rispetto alle versioni precedenti , quest’ultima non contiene novità di maggior rilievo, però ve ne sono alcune che meritano di essere citate e che mi hanno portato ad aggioranre la versione del linguaggio in uso nei progetti di sviluppo software nei quali sono coinvolto.
Vediamone alcune:
Operatore Nameof
Esistono diverse occasioni in cui ci troviamo ad usare la magia delle strighe nel nostro codice (forse anche troppe :P); cioè normali stringhe cui facciamo ricorso per scovare informazioni all’interno del codice. L’esempio classico, è quando si lancia un ArgumentNullException e si usa una stringa per ottenere il nome del parametro corrispondente che ha scatanenato l’eccezione.
Tuttavia, prima dell’avvento di C# 6.0, queste stringhe non erano convalidate a compile-time per cui eventuali cambiamenti (come ad esempio il semplice rinominare il parametro), non aggiornava automaticamente la stringa magica.
Ecco perchè ha senso usare l’operatore nameof
public decimal GetRevPar(decimal roomRevenues, int availableRoomCount) { if (roomCount < 0) { throw new ArgumentException("Negative value not allowed", nameof(availableRoomCount)); } return roomRevenues/availableRoomCount; }
Operatore null-condizionale
Questo forse è uno dei casi in cui ha più senso migrare alla nuova versione di c#. Ogni qualvolta mi trovo ad invocare una proprietà, o un metodo, devo sempre controllare che l’istanza non sia nulla, evitando che venga lanciata una NullReferenceException. Ne consegue un bel po’ di codice di cui farei volentieri a meno.
public int GetStringLength(string arg) { return arg?.Length ?? 0; }
Grazie a questo operatore, quindi, viene valutato il parametro arg prima di richiamare la proprietà Lenght. Nel caso in cui arg non sia null, allora restituisce il valore di Length, altrimenti null. L’aspetto interessante è che possiamo concatenare questo nuovo operatore condizionale di modo da poter fare chiamate multiple anche a metodi (come un FirstOrDefault() piuttosto che ToString()).
Formattazione stringhe
Un’altra semplificazione di c# 6.0 è un nuovo modo di formattare le stringhe; fino ad oggi per poter esporre i decimali di un valore eravamo abituati ad una sintassi come la seguente:
decimal totaleFattura = String.Format("{0:0.00}", (decimal)decTotale);
Oggi potremo richiamare la stessa così:
var totaleFattura = $"{(decimal)decTotale:0.00} €";
Dichiarazione proprietà
Possiamo sfruttare nuovi approcci anche in fase di dichiarazioni delle proprietà:
public string FullName { get; set; } = "Francesco Biacca";
E’ quindi adesso possibile inizializzare una proprietà direttamente in fase di dichiarazione, senza dover scrivere del codice nei metodi o nei costruttori.
Filtri nei blocchi Try/Catch
Con c# 6.0 possiamo lanciare un’eccezione solo quando viene rispettato il valore di una proprietà/argomento, come nel caso seguente
try { // ... } catch (ArgumentException exception) when (exception.ParamName == "ignore") { }