La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Nuove funzionalitA’ e caratteristiche del linguaggio

Presentazioni simili


Presentazione sul tema: "Nuove funzionalitA’ e caratteristiche del linguaggio"— Transcript della presentazione:

1 Nuove funzionalitA’ e caratteristiche del linguaggio
Le novità di C# 6 Nuove funzionalitA’ e caratteristiche del linguaggio

2 Mi presento Ing. Antonio Pelleriti Twitter: @zetanove
Mail: Web: Ultimo libro: Programmare con C# 5, LSWR 2014

3 Un grazie a

4 Agenda C# ieri e oggi Le novità di C# 6 Demo

5 C# 1.0 2002 Prima versione di C# Linguaggio ufficiale di .NET

6 C# 2.0 2005 Generics Tipi parziali Metodi anonimi Iteratori
get/set accessibilità separata Classi static Altro ancora…

7 C# 3.0 2007 Variabili di tipo implicito
Inizializzatori di oggetti e di collezioni Auto-properties Tipi anonimi Metodi di estensione Query expressions Espressioni Lambda Metodi parziali E altro ancora…

8 C# 4.0 2010 Dynamic binding Argomenti denominati e opzionali
Generics co/controvarianza E altro ancora…

9 C# 5.0 2012 Async Caller info attributes Altro…

10 Le novità di C# 6 Cosa vedremo in C# 6 Auto-Property Initializers
Using per membri statici Exception filter Index Inizializers (dizionari, ecc.) Null propagation Await in catch/finally Expression-bodied members Nameof String interpolation

11 Forse in C# 6 E cosa forse vedremo in C# 6 Primary constructor
Indexed member access Dichiarazione inline di variabili Binary literals e separatori di cifre Inizializzatori di eventi params IEnumerable

12 Auto property initializers
Inizializzazione di proprietà automatiche public class Persona { public string Nome{ get; set; } public string Cognome{ get; set; } } = "Antonio"; = "Pelleriti" L’inizializzatore agisce direttamente sul backing field. Non usa il set della proprietà. Gli inizializzatori sono eseguiti nell’ordine di apparizione Non possono usare this, dato che vengono eseguiti prima che l’oggetto sia stato inizializzato. Con I costruttori primari potrebbero essere inizializzati con i parametri dei costruttori stessi

13 Getter only auto property initializers
Anche in sola lettura public class Persona { public string Nome{ get; } = "Antonio"; } public class Persona { public string Nome{ get; } //Errore in C# 5 public Persona(string nome) Nome=nome; //Errore in C# 5 } NB in VS 2014 CTP le proprietà get only possono essere inizializzate solo con gli inizializzatori non nel costruttore Le proprietà automatiche possono ora anche avere il solo get Implementate con backing field readonly 2) E quindi possono essere inizializzate anche nel costruttore

14 Using static members Using di classe, permette di usarne i membri statici using System.Console; using System.Math; class Program { static void Main() WriteLine(Sqrt(3*3 + 4*4)); }

15 Exception Filter Catturare un’eccezione se si verifica una condizione
catch(Exception ex) if(cond1) { } catch(Exception ex1) if(cond2) private static bool Log(Exception e) { /* log it */ ; return false; } try { … } catch (Exception e) if (Log(e)) {} Gli exception filters sono particolarmente indicate per il catche rethrow perchè lascia lo stack invariato Una pratica commune di abuso accettato è quella di usare I filtri per il logging delle eccezioni, senza catturarla. Basta chiamare un metodo che fa il log e restituisce false.

16 Index initializer 1/1 Nuova sintassi per inizializzare dizionari o oggetti con indicizzatori var numbers = new Dictionary<int, string> { { 7 , "seven" }, { 9 , "nine" }, { 13 , "thirteen" }, }; var numbers2 = new Dictionary<int, string> [7] = "seven", [9] = "nine", [13] = "thirteen" Object e collection initializer introdotti con C# 3 forniscono una sintassi per inizializzare campi e proprietà di un oggetto, o per riempire collezioni con un insieme iniziale di elementi. L’inizializzazione di dizionari o di altri oggetti con indicizzatori è meno elegante (per qualcuno), quindi è stata aggiunta una sintassi per assegnare dei valor alle chiavi Usando un indicizzatore qualunque della classe. L’esempio numbers mostra che la differenza non è poi così ampia. Ma provando con una classe custom con indicizzatore

17 Index initializer 1/2 Classe con indicizzatore
public class Person { public string this[int index] get return numbers[index]; } set numbers[index] = value; Inizializzazione con indicizzatore var persona = new Person("antonio") { [0] = " ", [3] = " ", }; Ma provando con una classe custom con indicizzatore public class Person { public string Name { get; set; } public Person(string name) Name = name; } public string[] numbers = new string[5]; public string this[int index] get return numbers[index]; set numbers[index] = value;

18 Null conditional Null Propagation operator ? string str=…; int? len;
if(str!=null) len=str.Length; int? len= str?.Length; //null se str==null char? first=str?[0]; Spesso il codice diventa pieno di check per evitare null reference exception L’operatore null propagating, o null conditional consente di accedere ad un membro solo se l’oggetto è non null Inoltre può essere usato con membri come indicizzatori, e come dice il nome propagation, in maniera concatenata. Con comportamento di corto circuito, appa trova un membro null, restituisce null string str = null; int? len = str?.Length; char? primo = str?[0]; Console.WriteLine(len); Console.WriteLine(primo); Person p = null; string city = p?.MyAddress?.City?.ToLower(); public class Person { public Address MyAddress { get; set; } } public class Address { public string City { get; set; }

19 await in catch/finally
In genere errore di compilazione Cannot await in the body of a catch clause try{} catch { await MetodoAsincrono(); //errore in C# 5 } In c# 5.0 non era possibile, costringendoci a workaround come variabili booleane o altre amenità, tutto ciò perché ci è stato detto che era impossibile implementare tale feature. In C#6, è possibile, quindi, evidentemente, non era così impossibile. O perlomeno, hanno capito come farlo: sicuramente non è stato semplice, e non ci interessa sapere come funziona: questo è il vantaggio di avere funzionalità asincrone supportate nativamente dal linguaggio.

20 Expression bodies members
Utilizzo di espressioni lambda per implementare il corpo di proprietà public string Completo => String.Format("{0} {1}", Nome, Cognome); metodo public void Print(string title) => Console.WriteLine(title+" "+Nome + " " + Cognome); operatore public static implicit operator string (Person p) => p.Nome + " " + p.Cognome; Metodi, proprietà, operatori possono essere implementati utilizzando come loro corpo un’espressione labda

21 nameof Operatore nameof
int x = 0; string name=nameof(x); Console.WriteLine("{0}={1}", name, x); name=(nameof(Person.Address.ZipCode)); // returns "ZipCode" Certe volte è necessario stampare o ricavare una stringa che rappresenta il nome di alcuno elementi del programma, Per esempio per passare ad ArgumentException il nome dell’argomento colpevole Oppure generando un evento PropertyChanged per indicare il nome della prop Il tutto è naturalmnente fattibile con le stringhe, ma oltre a essere soggetto a errore di battitura, non va d’accordo con esigenze di refactoring L’operatore nameod (if x == null) throw new ArgumentNullException(nameof(x)); Si possono usare come operandi anche nomi di membri con sintassi dotted, l’operatore restituisce l’ultimo WriteLine(nameof(Person.Address.ZipCode)); // prints "ZipCode" Non è come reflection, perchè il compilatore sostituisce direttamente il nome con una stringa

22 DEMO Visual Studio ’14’ CTP 4
prebuilt Azure VM images with VS "14" CTP 4 already installed. Alcune features funzionanti in ctp solo con <LangVersion>experimental</LangVersion> In csproj End User Preview on top of Visual Studio 2013. (note: this VS 2013 preview is no longer updated)

23 Link utili .NET Compiler Platform ("Roslyn")
C# 6 Language Features status ure%20Status VS 2015 preview downloads-vs

24 promo Programmare con C# 5 guida completa

25 Domande


Scaricare ppt "Nuove funzionalitA’ e caratteristiche del linguaggio"

Presentazioni simili


Annunci Google