Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

C# 7 - Nouveautés

56 views

Published on

Présentation des nouveautés apportées par la version 7 du langage C# : Méthodes locales, Tuples, Déconstructeurs, Pattern matching, Variables de sortie, Membres sous forme d’expression, Amélioration de la levée des exceptions, ...

Published in: Education
  • Be the first to comment

  • Be the first to like this

C# 7 - Nouveautés

  1. 1. AlgoWin - James RAVAILLE http://www.algowin.fr Langage C# 7 Nouveautés Spécialiste de la formation et de l’ingénierie avec la plateforme Microsoft .NET
  2. 2. AlgoWin - James RAVAILLE PRÉSENTATION Dans ce document, nous vous présentons quelques unes de ces nouveautés Programmation fonctionnelle Amélioration des performances Simplification du code • Méthodes locales • Tuples • Déconstructeurs • Pattern matching • Variables locales et retour de fonctions par référence • Généralisation des types de retour asynchrones • Littéraux binaires • Séparateur de chiffres • Variables de sortie • Membres sous forme d’expression • Amélioration de la levée des exceptions
  3. 3. AlgoWin - James RAVAILLE LES MÉTHODES LOCALES Méthodes implémentées au sein de méthodes Permettent de simplifier l’implémentation de traitements de données à usage très local : public void ExecuterMethodeLocale() { bool EstPair(int aNombre) { // Traitement. return aNombre % 2 == 0; } bool bResult = EstPair(10); List<int> oListe, oListeNbPairs; oListe = new List<int>() { 1, 4, 8, 9, 13 }; oListeNbPairs = oListe.Where(i => EstPair(i)).ToList(); } Utilisation de la méthode locale. La méthode locale EstPair ne peut être appelée que depuis le code de ExecuterMethodeLocale
  4. 4. AlgoWin - James RAVAILLE LES TUPLES (1) Lors de l’implémentation de fonctions, il est parfois nécessaire de renvoyer plusieurs informations Avec la version 4.6.2 du Framework .NET, il est nécessaire d’installer le package Nuget System.ValueTuple Méthode retournant un couple d’informations : Méthode retournant une liste de couples d’informations : public (int, string) GetFormation() { return (100, "Formation C#"); } public List<(int, string)> GetListeFormations() { return new List<(int, string)> { (100, "Formation Windows Presentation Foundation"), (150, "Formation .NET Core")}; } (int, string) oFormation = oNouveaute.GetFormation(); List<(int, string)> oListeFormations = oNouveaute.GetListeFormations();
  5. 5. AlgoWin - James RAVAILLE LES TUPLES (2) public (int NbValeurs, long SommeValeurs) GetInfoCollection(IEnumerable<int> aListeValeurs) { int iNbValeurs = 0; long lSommeValeurs = 0; foreach (int dValeur in aListeValeurs) { iNbValeurs++; lSommeValeurs += dValeur; } return (iNbValeurs, lSommeValeurs); } Retourne à la fois le nombre et la somme des nombres (int NbValeurs, long SommeValeurs) oResult = this.GetInfoCollection(oListeNombres);
  6. 6. AlgoWin - James RAVAILLE LES DÉCONSTRUCTEURS Permet de « déconstruire » un objet vers un tuple La classe permettant de créer cet objet doit implémenter une procédure : • Nommée Decontruct • Avoir des paramètres de sortie indiquant les informations à fournir au tuple public class Heure { public int Minutes { get; set; } public int Secondes { get; set; } public Heure(int aMinutes, int aSecondes) { this.Minutes = aMinutes; this.Secondes = aSecondes; } public void Deconstruct(out int aMinutes, out int aSecondes) { aMinutes = this.Minutes; aSecondes = this.Secondes; } } Cette méthode sera appelée lors de la création du tuple. Elle peut être surchargée
  7. 7. AlgoWin - James RAVAILLE LES PATTERNS MATCHINGS Permet de déterminer si une valeur correspond à des cas prédéfinis. Exemple : switch (aFormeGeometrique) { case Rectangle oRectangle: { sMessage = $"Aire du rectangle : {oRectangle.Largeur * oRectangle.Hauteur}"; break; } case Disque oDisque when oDisque.Rayon <= 10: { sMessage = "Disque usé"; break; } case Disque oDisque: { sMessage = "Disque neuf"; break; } default: { break; } } L’instruction switch permet d’évaluer le type d’un objet La clause when permet de préciser une condition L’ordre des clauses est important afin de gérer correctement les conflits. Toujours spécifier de la plus précise à la plus générale
  8. 8. AlgoWin - James RAVAILLE LES VARIABLES DE SORTIE L’utilisation des paramètres de sortie nécessitait de déclarer au préalable les variables avant d’appeler les méthodes qui en utilisaient. Exemple : La version 7 du langage C# permet de déclarer ces variables directement dans l’appel des méthodes : string sValeur = "10"; int iValeur; bool bResult = int.TryParse(sValeur, out iValeur); bool bResult = int.TryParse(sValeur, out int iValeur); Déclaration de la variable correspondant au paramètre de sortie (résultat de la conversion en cas de réussite) Il est également possible d’ignorer la valeur du paramètre de sortie, en spécifiant « _ » en lieu et place du nom de la variable Aussi, l’utilisation de l’inférence de type est autorisée
  9. 9. AlgoWin - James RAVAILLE MEMBRES SOUS FORME D’EXPRESSION La version 6 du langage C# a introduit cette fonctionnalité pour les propriétés (accesseurs), les méthodes et indexeurs La version 7 l’étend aux constructeurs, destructeurs : public class Heure { public int Minutes { get; set; } public int Secondes { get; set; } public long TotalSecondes => this.Minutes * 60 + this.Secondes; public string ToString() => $"({this.Minutes}, {this.Secondes})"; } private int _Minutes; public int Minutes { get => this._Minutes; set => this._Minutes = value; } public long TotSecondes => this.Minutes * 60 + this.Secondes; public Heure(int aMinutes) => this.Minutes = aMinutes; public string ToString() => $"({this.Minutes}, {this.Secondes})"; ~Heure() => Debug.WriteLine("Finaliseur");
  10. 10. AlgoWin - James RAVAILLE AMÉLIORATION DE LA LEVÉE D’EXCEPTIONS Jusqu’à la version 6 du langage C#, l’instruction throw (permettant de lever une exception), ne pouvait pas être utilisée dans un contexte où une expression était attendue La version 7 du langage C# simplifie l’écrire de ces blocs d’instructions : throw est une instruction convertible en n’importe quel type. Par exemple, l’écriture de la validation de valeurs des paramètres d’une méthode est simplifiée : // Dans une expression lambda. Func<int> f = () => throw new Exception(); // Dans une expression conditionnelle. int x = m == 75 ? 25 : throw new Exception(); public class Disque : FormeGeometrique { public double Rayon { get; set; } public Disque(double aRayon) : base() { this.Rayon = (aRayon > 0) ? aRayon : throw new ArgumentException(nameof(aRayon)); } }
  11. 11. AlgoWin - James RAVAILLE VARIABLES LOCALES ET RETOURS DE FONCTIONS PAR RÉFÉRENCE (1) Les applications à haute performance utilisent des types valeurs (telles que les structures) : • Meilleure gestion de la mémoire • Gestion de données contigües dans un tableau Toutefois, l’utilisation de types valeurs implique de nombreuses copies de données Les versions précédentes du langage C# permettent depuis toujours de passer des paramètres par référence plutôt que par valeur, grâce à l’utilisation du mot clé ref La version 7 du langage C# étend ce mécanisme aux variables locales et aux valeurs de retour des fonctions, évitant ainsi les copies inutiles de données, améliorant ainsi les performances lors de l’exécution
  12. 12. AlgoWin - James RAVAILLE VARIABLES LOCALES ET RETOURS DE FONCTIONS PAR RÉFÉRENCE (2) Implémentation de la structure : Méthode de recherche d’un élément à partir d’un identifiant unique : Recherche d’un élément : public struct Structure { public Guid Identifiant { get; set; } public string Nom { get; set; } } public static Structure[] _Elements; public static ref Structure GetElement(Guid aUid) { for (int iIndice = 0; iIndice < _Elements.Length; iIndice++) { if (_Elements[iIndice].Identifiant == aUid) { return ref _Elements[iIndice]; } } throw new Exception("Elément non trouvé"); } ref Structure item = ref GetElement(Guid.Parse("0ED9432A-8BEB-4076-A630-821DA9BE2A21"));

×