TUTTE LE NOVITA DI C# 7

visual-studio-2017-7-marzo

LA NUOVA MAJOR RELEASE DI C#, DENOMINATA 7.0, APPORTA DIVERSE NUOVE CARATTERISTICHE CHE
PERMETTERANNO AGLI SVILUPPATORI .NET DI AUMENTARE LA PROPRIA PRODUTTIVITÀ: SCOPRIAMO
TUTTE LE NOVITÀ INTRODOTTE NEL LINGUAGGIO CON VISUAL STUDIO 2017.

Il linguaggio C# continua ad evolversi e conta ormai una storia più che decennale affermandosi come uno ra i più utilizzati nel mondo dello sviluppo software.
Viene annunciato al pubblico per la prima volta nel luglio del 2000 alla PDC (Professional Developer Conference),
insieme al .NET Framework e alla prima versione .NET dell’ambiente di sviluppo Visual Studio. Nel febbraio 2012 il .NET Framework arriva alla versione 4.5, e Visual Studio invece viene aggiornato alla versione 2012. Nell’agosto dello stesso anno vengono pubblicate le specifiche di C# 5.0, che includono come caratteristica fondamentale il paradigma di programmazione asincrona. Quella che fino ad oggi è la versione ufficiale più recente, la versione 6,  iene invece rilasciata nel luglio 2015, assieme a Visual Studio 2015 e a .NET 4.6. Infine siamo pronti per mostrarvi,
nel seguito dell’articolo, le novità di C# 7, che vedranno ufficialmente la luce con Visual Studio 2017. Entrambi già disponibili dal novembre 2016, essendo stati presentati all’ormai noto evento annuale di Microsoft denominato Connect.

VISUAL STUDIO 2017
Per installare Visual Studio 2017, attualmente in versione Release Candidate (al momento della stesura dell’articolo
è stata rilasciata l’aggiornamento Update 2), andate al link indicato nel box e lanciate il file eseguibile scaricato. Una
volta partita l’installazione, noterete, se avete già avuto modo di installare Visual Studio nelle precedenti release, una nuova esperienza utente ed in generale l’ottimizzazione delle prestazioni dell’installer stesso e dello spazio occupato.
Infatti l’installazione minima ha ora una dimensione di poche centinaia di megabyte, ma contiene comunque il supporto per le modifiche di base del codice per più di venti linguaggi, oltre alle funzionalità di controllo del codice sorgente. La maggior parte degli utenti preferisce installare più componenti, a seconda del proprio ambito di  viluppo, è quindi così possibile aggiungere uno o più dei cosiddetti workload che rappresentano i framework, i linguaggi e le piattaforme più comuni. Nel nostro caso, se state installando ora Visual Studio 2017, sarà opportuno installare almeno il workload per lo sviluppo .NET Desktop, in maniera da poter provare le caratteristiche di C# 7 in una applicazione Console.

Visual Studio 2017, di per se, contiene moltissime novità, ma naturalmente non abbiamo spazio a sufficiente per includerle all’interno di questo articolo, pertanto vi rimando alla seguente pagina: https://www.visualstudio.com/it·it/news/releasenotes/vs2017-relnotes.
I workload disponibili sonoe saranno costantemente aggiornati, in maniera da poter aggiungere alla vostra installazione di sviluppo sempre nuovi componenti e framework. Una volta installato l’IDE, lanciato, e fatto qualche
giro per scoprire qualche novità dell’ambiente, saremo già pronti a fare qualche esperimento con C# 7. Create quindi innanzitutto una nuova soluzione, magari anche una semplice Applicazione Console. l.’.impostazione predefinita utilizza già la versione 7 di C#. Dato che andremo ad analizzare le novità della versione 7, lasciate l’impostazione
su default oppure selezionate manualmente C# 7.0. In ogni caso, se l’impostazione è su una versione precedente,
il compilatore ci awiserà con un chiaro errore in caso di utilizzo di caratteristiche che richiedono necessariamente
la versione C# 7.

LE NOVITÀ DI C# 7 .O
Prima di analizzarle una per una ed in dettaglio con qualche esempio di codice, ecco una panoramica della caratteristiche introdotte dalla prossima release di C#. Molti termini piattaforme più comuni. Nel nostro caso, se state installando ora Visual Studio 2017, sarà opportuno installare almeno il workload per lo sviluppo .NET DEsktop, in maniera da poter provare le caratteristiche di C# 7 in una applicazione Console.

visual-studio-2017-7-marzo

Forse potranno risultare oscuri a chi non conosce ancora il linguaggio, oppure anche a chi pur programmando in C#,
non ha seguito l’evoluzione e le discussioni sulle funzionalità da introdurre.

In ordine sparso ecco un elenco delle novità principali di C# 7:
• Valori letterali per numeri binari e separatori di cifre;
• Supporto nativo delle tuple e relative funzionalità
• Introduzione dei deconstructor (non solo per le tuple)
• Miglioramento nell’utilizzo delle variabili out;
• Funzioni locali, cioè metodi dichiarati direttamente in altri metodi
• Pattern matching (nell’operatore is e nell’istruzione switch)
• Utilizzo di ref per restituire e utilizzare variabili locali.
• Espressioni corpo utilizzabili anche per costruttori e get/set di proprietà
• Throw di eccezioni anche nelle espressioni

Con il rilascio definitivo di C# 7 potrebbero anche esserci delle novità, non ci resta che attendere e seguire il progetto
ufficiale su Github, dove fra l’altro, trovate anche l’elenco delle nuove feature sia per C# 7 che per VB.NET 15, ma anche quelle che sono già in lavorazione per un futuro ancora più remoto. Date un’occhiata al seguente link: https://github.com/dotnet/ roslyn/ blob/ master/docs/Languageo020Feature%20Status.md
Nei prossimi paragrafi analizzeremo e proveremo sul campo tutte le novità annunciate.

VALORI BINARI E SEPARATORI DI CIFRE
Quando si ha a che fare con numeri molto lunghi, composti cioè da molte cifre sorge spesso qualche difficoltà nel  leggerli e comprendere il valore. Quindi, come quando scriviamo a mano dei numeri introducendo dei separatori delle migliaia, C# 7 permette di separare le cifre utilizzando il separatore _(underscore):
int numero = 1234567890;

La variabile numero è composta da 1o cifre, per aumentarne la leggibilità, possiamo per esempio scrivere ora:
int numerosep = 1_234_567_890;
Il separatore è utilizzabile in tutti i tipi numerici (meglio naturalmente se sono tipi che che permettono valori molto
grandi), per esempio long, double e così via .
long longNum= 1_234_567 _890;
double longDoub = 1_234_567.890_9999;
Un’altra miglioria sempre a livello di leggibilità è costituita dall’Introduzione di valori letterali binari. In tale modo è
possibile specificare e utilizzare sequenze di bit O e 1, anziché scrivere in valore decimale oppure esadecimale.
Per esempio per dichiarare un intero di valore 8, che in binario è rappresentato come 1000, basta anteporre alla sequenza di bit, la stringa Ob: var b= Obl000;
Naturalmente anche in questo caso possiamo separare i bit con_, utilissimo per rappresentare numeri molto lunghi, per esempio raggruppandoli a blocchi di 4 bit b= Ob1010_0100_1111_1100; //= 42236

TUPLE
L’introduzione al supporto nativo delle tuple, è una delle novità più corpose e attese. Una tupla è una struttura dati con un numero e una sequenza di elementi, di tipi anche differenti. La classe System.Tuple è già disponibile dalla versione 4.0 di .NET Framework. Un esempio di tupla è una struttura di dati costituita da tre elementi, nota come tupla con 3 elementi o terna. In C# 6 potremmo creare un tale oggetto nel seguente modo:
Tuple<string, double, double> t = Tuple.Create<string,double, double>(“Roma”, 41.8919300, 12.5113300);
Console. Writeline(t);
L’utilità delle tuple è indubbia, per esempio per ottenere più valori come risultato di un metodo, o raggruppare valori in maniera rapida anziché implementare apposite classi POCO. C# 7 introduce una apposita sintassi per creare le tuple:
var tuple = \Roma”, 41.8919300, 12.5113300);
A seconda della versione di Visual Studio 2017 e del .NET Framework utilizzate, potrebbe essere restituito un errore di compilazione come il seguente;
Error CS8179: Predefined type ‘System.ValueTuple · 3’ is not defined or imported

In tal caso dovete installare il pacchetto nugget che fornisce il support al tipo System.ValueTuple, che sarà integrato
direttamente nei prossimi aggiornamenti definitivi del .NET Framework, e rilasciati con la versione finale dell’IDE.
Come suddetto, le tuple così dichiarate possono essere utilizzate per esempio come tipo di ritorno di un metodo:
public static (double, double) GetCoordinates(string city)
{
if (city== “Roma”)
retum (41.8919300, 12.5113300);
retum (O, O);
}
Ed il metodo così utilizzato:
var coordinate=GetCoordinate(“Roma”);
I singoli componenti di una tuple sono acessibili mediante le proprietà denominate di default con Item 1, ltem2, … ltemN:
Console. Writeline( coordinate.Iteml);
E’ però possibile assegnare anche dei nomi esplicitamente ai singoli elementi di una tupla:
(double lat, double lon) = (41.89193, 12.51133)
E specificare i valori da assegnare direttamente mediante i nomi assegnati:

public static (double lat, double lon)? GetCoordinates(string city)
{
if (city ==”Roma”)
retum (lat:41.8919300, lon:l2.5113300);
retum null;
}
Il tipo tuple, o esattamente System.ValueTuple, è un tipo valore, quindi non può assumere valore null. Nell’esempio
precedente si noti quindi come il tipo di ritorno è una tupla nullable, ottenuta con la normale sintassi che prevede il ?
dopo il nome del tipo. Spesso, più che ricavare direttamente una tupla come oggetto composto, e poi accedere i singoli elementi, è più comodo ricavare direttamente i singoli valori.
La sintassi di deconstruction specifica semplicemente attraverso un’operazione di dichiarazione, l’assegnazione
delle singole parti a delle variabili nuove di zecca:
(double lat, double lon) = Geteoordinates(“Roma”);
In tal modo, avremo ora a disposizione due variabili lat e lon di tipo double.La stessa procedura può essere eseguita anche usando la keyword var. (var latl, var lonl) = GetCoordinates(“Roma”);
Oppure specificando una singola var al di fuori delle parentesi.

Mentre se abbiamo già delle variabili del tipo corrispondente agli elementi della tupla, possiamo decostruire la tu pia stessa assegnandola alle variabili:
double d1,d2;
(dl, d2) = GetCoordinates(“Roma”);

DECONSTRUCTION DI UN TIPO
La deconstruction è una procedura che non vale solo per le tuple. Un qualunque tipo può essere”decostruito: dotandolo di un apposito metodo Deconstruct.
Per esempio supponendo di avere la seguente semplice classe per rappresentare le coordinate di un punto.
class Coordinate
{
public double Lat { get; }
public double Lon { get; }
public Coordinate(double lat, double lon) { Lat =
lat; Lon = lon; }
}
Per poter assegnare ad un tupla di due double un’Istanza di Coordinate, basta semplicemente implementare il metodo Oeconstruct come di seguito:
public void Deconstruct(out double lat, out double Jon)
{
lat = Lat;
lon = Lon;
}
Il metodo non fa altro che assegnare a due parametri di uscita (out) i valori dei propri campi. A questo punto la seguente assegnazione, dietro le quinte, utilizza proprio il metodo Deconstruct
Coordinate coordinate = new Coordinate(38.123, 15.44);
(lat, lon) = coordinate; //late lon variabili double
dichiarate in precedenza