Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoTerenzio Grieco Modificato 10 anni fa
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
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.