Meetup Microsoft Net Toulouse Rtrospective des dernires nouveauts

  • Slides: 37
Download presentation
Meetup Microsoft. Net Toulouse Rétrospective des dernières nouveautés de C# Clev. Lab Aurélien Lemoine

Meetup Microsoft. Net Toulouse Rétrospective des dernières nouveautés de C# Clev. Lab Aurélien Lemoine & Xavier Giovannacci Lundi 19 mars 2018

Sommaire Rétrospective des dernières nouveautés de C# o Histoire du C# o C# 6.

Sommaire Rétrospective des dernières nouveautés de C# o Histoire du C# o C# 6. 0 o C# 7. 1 o C# 7. 2 o Que nous réservent les futures versions de C# ? Tour d’horizon des possibilités de développement pour Microsoft Office par Guillaume Lacasa

Clev. Lab Agence fondée en 2010, spécialisée sur les plateformes mobiles et les technologies

Clev. Lab Agence fondée en 2010, spécialisée sur les plateformes mobiles et les technologies Microsoft. Notre site : www. clevlab. fr Clev. Lab est éditeur de ses propres applications o Une dizaine d’applications Windows Phone et Windows 10, dont Feed. Lab o Plus de 2, 5 millions de téléchargements Clev. Lab est aussi prestataire de services pour accompagner les entreprises sur Windows 10, les bots, les cognitives services o Cardiweb, Chauffeur-Privé, Digi. School, Le Point, Les Indés Radios, Microsoft France, Microsoft UK, Orange, RTE, S 4 M, Sanofi, Sen. se, Se Coucher Moins Bête, Société Générale, …

Histoire du C# Janvier 2002 : lancement de C# 1. 0, avec Visual Studio.

Histoire du C# Janvier 2002 : lancement de C# 1. 0, avec Visual Studio. Net 2002 o C# se pose en alternative à Java Novembre 2005 : lancement de C# 2. 0, avec Visual Studio 2005 o Génériques (List<T>), o Types partiels et types nullables o Itérateurs (foreach) Novembre 2007 : lancement de C# 3. 0, avec Visual Studio 2008 o Propriétés auto-implémentées (get; set; ) o Les types anonymes (var) o Les méthodes d’extension (Word. Count(this string str)) o LINQ

Histoire du C# Avril 2010 : lancement de C# 4. 0 o Arguments nommés

Histoire du C# Avril 2010 : lancement de C# 4. 0 o Arguments nommés lors de l’appel d’une méthode Print. Details(id: 31, product: "Red Mug", quantity: 2); o Arguments facultatifs, avec une valeur par défaut, dans l’appel d’une méthode public void Print. Details(int id, int quantity = 1, string product = “unknown") Août 2012 : lancement de C# 5. 0, avec Visual Studio 2012 o Programmation asynchrone, avec async / await

C# 6. 0 Juillet 2015 : lancement de C# 6. 0, avec Visual Studio

C# 6. 0 Juillet 2015 : lancement de C# 6. 0, avec Visual Studio 2015 Nouveau compilateur C# : Roslyn

C# 6. 0 – Operateur null-conditional Vérification de la valeur null Vérification plus facile

C# 6. 0 – Operateur null-conditional Vérification de la valeur null Vérification plus facile et fluide Définir une valeur par défaut si null Avant if(object != null && object. List. Count > 0) { … } Maintenant if (object? . List? . Count > 0) { … }

C# 6. 0 - String Interpolation Une autre manière pour le string. Format Avant

C# 6. 0 - String Interpolation Une autre manière pour le string. Format Avant String text = string. Format(“exemple {0} est dispo {1}”, variable 0, variable 1); Maintenant String text = $”exemple {variable 0} est dispo {variable 1}”;

C# 6. 0 - Exception Catch avec un filtre Gestion du await dans les

C# 6. 0 - Exception Catch avec un filtre Gestion du await dans les blocks de catch et finally Exemple try {. . } catch (Http. Request. Exception e) when (e. Message. Contains(“ 301”)) { await Check. Expection(e); } finally { await Popup(); }

C# 6. 0 – Expression Nameof Obtenir le nom de chaîne simple d’une variable

C# 6. 0 – Expression Nameof Obtenir le nom de chaîne simple d’une variable / type / membre Garantir la validité de votre code lors du renommage de la variable Particulièrement utile dans le INotify. Property. Changed Exemple string text = nameof(this. Variable); Console. Write. Line(text); //Variable Exemple INotify. Property. Changed(this, new Property. Changed. Event. Args(nameof(this. Variable))

C# 6. 0 - Initialisers Permet d’initialiser une List Avant private List<string> list. Messages

C# 6. 0 - Initialisers Permet d’initialiser une List Avant private List<string> list. Messages = new List<string>(); public Constructor() { list. Messages. Add(“tata”); list. Messages. Add(“toto”); } Maintenant private List<string> list. Messages = new List<string> { “tata”, “toto” };

C# 6. 0 - Initialisers Permet d’initialiser un Dictionary Avant private Dictionary<int, string> list.

C# 6. 0 - Initialisers Permet d’initialiser un Dictionary Avant private Dictionary<int, string> list. Messages = new Dictionary<int, string>(); public Constructor() { list. Messages. Add(0, “tata”); list. Messages. Add(1, “toto”); } Maintenant private Dictionary<int, string> list. Messages = new Dictionary<int, string> { [0] = “tata”, [1] = “toto” };

C# 7. 0 Mars 2017 : lancement de C# 7. 0, avec Visual Studio

C# 7. 0 Mars 2017 : lancement de C# 7. 0, avec Visual Studio 2017

C# 7. 0 – Paramètre out Plus besoin de déclarer le paramètre out avant

C# 7. 0 – Paramètre out Plus besoin de déclarer le paramètre out avant de l’utiliser Avant int result; if (int. Try. Parse(input, out result)) Console. Write. Line(result); Maintenant if (int. Try. Parse(input, out int result)) Console. Write. Line(result);

C# 7. 0 – Tuples Un Tuple est une structure de données avec un

C# 7. 0 – Tuples Un Tuple est une structure de données avec un nombre spécifique d’éléments Un Tuple permet d’empaqueter plusieurs valeurs dans cet objet unique, utile dans le cas d’une fonction qui se doit de retourner un objet unique Les Tuples existent depuis le C# 4. 0, mais avaient pour contrainte de nommer les éléments Item 1, Item 2, … Avant var person = Tuple. Create("Cédric", 30, "Toulouse"); Console. Write. Line($"{person. Item 1} a {person. Item 2} ans et habite {person. Item 3}");

C# 7. 0 – Tuples Les nouvelles fonctionnalités sont disponibles via le package Nuget

C# 7. 0 – Tuples Les nouvelles fonctionnalités sont disponibles via le package Nuget System. Value. Tuple Plus rapide à créer et plus simple à utiliser Tuples non nommés private (string, int) Get. Person() { return (“Cédric", “Dupond“, 32); } var p = Get. Person(); String name = p. Item 2;

C# 7. 0 – Tuples nommés private (string Firstname, string Name, int Age) Get.

C# 7. 0 – Tuples nommés private (string Firstname, string Name, int Age) Get. Person() { return (“Cédric", “Dupond“, 32); } var p = Get. Person(); String name = p. Name; (string Prenom, string Nom, int Age) p = Get. Person(); String name = p. Nom; Attention en XAML avec le binding, il faudra utiliser Item 1, Item 2

C# 7. 0 – Eléments ignorés (discards) Il s’agit d’une variable dont on souhaite

C# 7. 0 – Eléments ignorés (discards) Il s’agit d’une variable dont on souhaite volontairement ignorée la valeur Elle s’écrit via un underscore « _ » Utile dans une méthode avec un paramètre out ou lors de la restitution d’un Tuple Exemple paramètre out foreach (string date. String in date. Strings) { if (Date. Time. Try. Parse(date. String, out _)) Console. Write. Line($"'{date. String}': valid"); else Console. Write. Line($"'{date. String}': invalid"); }

C# 7. 0 – Eléments ignorés (discards) Exemple Tuple private static (string, double, int,

C# 7. 0 – Eléments ignorés (discards) Exemple Tuple private static (string, double, int, int) Get. Population (string name, int year 1, int year 2) { //Traitement des données. . . return (name, area, year 1, population 1, year 2, population 2); } public static void Main() { var (_, _, _, pop 1, _, pop 2) = Get. Population(“Toulouse", 1960, 2010); Console. Write. Line($"Population change, 1960 to 2010: {pop 2 - pop 1}"); }

C# 7. 0 – Pattern matching Permet de valider la présence de patterns dans

C# 7. 0 – Pattern matching Permet de valider la présence de patterns dans des données en entrée Les instructions is et switch ont été enrichies IS - Avant Client client = user as Client; if (client != null && client. Is. Active) { client. Buy(); //Traitement des données… } IS - Maintenant if (user is Client client && client. Is. Active) { client. Buy(); //Traitement des données… }

C# 7. 0 – Pattern matching Jusqu’à C# 6, le switch était réservé aux

C# 7. 0 – Pattern matching Jusqu’à C# 6, le switch était réservé aux types primitifs (bool, int, string, …) Avec le C# 7, le switch gère les patterns SWITCH - Maintenant public void Check. Profile(IUser user) { switch (user) { case Client c when c. Age >= 18): Console. Write. Line(c. Name); break; case Manager m when m. Age >= 18 && m. Is. Active: Console. Write. Line(m. Name); break; default: //Todo break; } }

C# 7. 0 – Fonctions locales Permet d’écrire une fonction dans une fonction (méthodes,

C# 7. 0 – Fonctions locales Permet d’écrire une fonction dans une fonction (méthodes, constructeurs, propriétés, …) Elle ne peut être appelée que dans son membre conteneur Permet de clarifier l’objectif d’un code, et donc d’en limiter l’accès Exemple public String Function. A(String name, String firstname) { if(String. Is. Null(firstname)) return Function. B(name); else return firstname; } String Function. B(String person. Name) { //Traitement des données. . . return ". . . "; }

C# 7. 0 – Nouveaux membres expression bodied Permet de simplifier l’implémentation Introduit dans

C# 7. 0 – Nouveaux membres expression bodied Permet de simplifier l’implémentation Introduit dans le C# 6 (méthode et get) et enrichit dans le C# 7 Exemple private string label; // Get / set accessors public string Label { get => label; set => this. label = value ? ? "Default label"; } // Constructor public My. Class(string label) => this. Label = label; // Finalizer ~ My. Class() => Console. Write. Line("Finalized!");

C# 7. 0 – Expressions throw Jusqu’à présent throw était toujours une instruction C#

C# 7. 0 – Expressions throw Jusqu’à présent throw était toujours une instruction C# 7 apporte l’expression throw avec un usage identique Avant var user = Load. User(); if (user == null) throw new Invalid. Operation. Exception("Could not load user"); Maintenant var user = Load. User() ? ? throw new Invalid. Operation. Exception("Could not load user");

C# 7. 0 – Syntaxe littérale numérique Pratique pour écrire de grandes valeurs Utile

C# 7. 0 – Syntaxe littérale numérique Pratique pour écrire de grandes valeurs Utile pour créer un masque binaire Avant long number = 100000; Maintenant long number = 10_000_000; int one = 0 b 0001; int two = 0 b 0010; int thirty. Two = 0 b 0010_0000;

C# 7. 1 Août 2017 : lancement de C# 7. 1, avec Visual Studio

C# 7. 1 Août 2017 : lancement de C# 7. 1, avec Visual Studio 2017 – version 15. 3

C# 7. 1 - Expressions Default Amélioration des expressions de valeur par défaut Avant

C# 7. 1 - Expressions Default Amélioration des expressions de valeur par défaut Avant List<Object> list. Data = default(List<string>); Maintenant List<Object> list. Data = default;

C# 7. 1 - Initialisation Tuple Amélioration de la fonctionnalité des tuples introduite dans

C# 7. 1 - Initialisation Tuple Amélioration de la fonctionnalité des tuples introduite dans C# 7. 0 Avant String name = "Jean"; int age = 30; var person = (n: count, a: text); String t = data. n; Maintenant String name = "Jean"; int age = 30; var person = (name, age); String t = data. name;

C# 7. 2 Novembre 2017 : lancement de C# 7. 2, avec Visual Studio

C# 7. 2 Novembre 2017 : lancement de C# 7. 2, avec Visual Studio 2017 – version 15. 5

C# 7. 2 – Sémantique de référence avec les types valeur out : la

C# 7. 2 – Sémantique de référence avec les types valeur out : la méthode définit la valeur de l’argument utilisé comme paramètre int. Try. Parse(input, out int result) ref : la méthode peut définir la valeur de l’argument utilisé comme paramètre in : sur un paramètre pour spécifier qu’un argument est passé par référence, mais pas modifié par la méthode appelée Exemple private static double Calculate. Distance(in Point p 1, in Point p 2) { double x. Difference = p 2. X – p 1. X; return x. Difference; }

C# 7. 2 – Private protected Niveaux d’accessibilité jusqu’à présent public = accès non

C# 7. 2 – Private protected Niveaux d’accessibilité jusqu’à présent public = accès non limité private = accès limité à la classe conteneur protected = accès limité à la classe conteneur ou à ses dérivés internal = accès limité à l’assembly actuelle protected internal = accès limité à l’assembly actuelle ou aux dérivés de la classe conteneur Nouvel accesseur private protected = accès limité à la classe conteneur ou à ses dérivés dans l’assembly actuelle

Les prochaines nouveautés du C# 7. 3 o Evolution des Tuples o C# étant

Les prochaines nouveautés du C# 7. 3 o Evolution des Tuples o C# étant open source, on peut suivre l’avancée sur https: //github. com/dotnet/csharplang/milestone/11 Support des égalités == et != Ajout des "Blittable" / "Unmanaged " o Type Générique avec des types non managées : int, bool, struct, enum. . .

Les prochaines nouveautés du C# 8. 0 o Planning : https: //github. com/dotnet/roslyn/blob/master/docs/Language%20 Feature%20

Les prochaines nouveautés du C# 8. 0 o Planning : https: //github. com/dotnet/roslyn/blob/master/docs/Language%20 Feature%20 Status. md

C# 8. 0 - Non-nullable référence type Warning pour éviter les références null Variable

C# 8. 0 - Non-nullable référence type Warning pour éviter les références null Variable non null Private string text; //non-nullable string text = null; => Warning Variable null Private string? text; //nullable string text = null; => pas de Warning Disponible en preview pour VS 2017 15. 6

C# 8. 0 - Ranges Nouvelle expression « x. . y » Plage de

C# 8. 0 - Ranges Nouvelle expression « x. . y » Plage de valeur Utilisation : Statut : en discussion

C# 8. 0 - Default Interface Implementations Implémentation par default de l’interface o Implémentation

C# 8. 0 - Default Interface Implementations Implémentation par default de l’interface o Implémentation de méthode / properties en private ou public « Multi-héritage » avec les interfaces, contrairement aux classes abstraites Statut : prototype en cours

Des questions ?

Des questions ?