Developpez.com - Rubrique .NET

Le Club des Développeurs et IT Pro

Les nouveautés de C# 6

Mise à jour du tutoriel de Thomas Levesque

Le 2014-04-09 20:40:51, par tomlev, Rédacteur/Modérateur
Bonjour,

Cette discussion est destinée à recevoir vos commentaires concernant l'article Les nouveautés de C# 6.

Lors de la conférence BUILD 2014, Microsoft a fait plusieurs annonces importantes ; la plus marquante, de mon point de vue de développeur, est que le projet Roslyn est maintenant open source ! Pour rappel, il s'agit du nouveau compilateur pour C# et VB.NET. Du coup, bien que le projet ne soit pas encore terminé, la liste des nouveautés des langages est déjà disponible, et on peut même commencer à jouer avec certaines d'entre elles. Cet article se propose de faire un petit tour d'horizon des nouveautés prévues pour C# 6.
  Discussion forum
26 commentaires
  • tomlev
    Rédacteur/Modérateur
    Bonjour,

    Un an après la première publication, je viens de mettre à jour l'article sur les nouveautés de C# 6 pour tenir compte de l'évolution de la situation.

    En effet, depuis la conférence BUILD en 2014, les choses ont bien changé : le design du langage est maintenant figé et ne devrait plus évoluer. Certaines fonctionnalités qui étaient initialement prévues ont finalement été abandonnées, d'autres ont un peu changé par rapport à ce qui était envisagé. Sauf surprise de dernière minute, l'article devrait maintenant correspondre au langage C# 6 tel qu'il sera lors sa sortie finale.

    Bonne (re)lecture !

    Lire l'article: les nouveautés de C# 6
  • worm83
    Membre éprouvé
    Bonjour,

    Merci pour cet article.

    J'aime bien dans l'ensemble les facilités apportées par cette nouvelle version.
    Le seul truc qui me fait "tické" est cela car je le trouve "brouillon". Le reste est très intéressante.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
      
      class Point(private readonly int x, private readonly int y) 
        { 
    
            public int X { get { return x; } } 
    
            public int Y { get { return y; } } 
    
        }
  • pascalCH
    Membre averti
    Envoyé par Jabbal'H
    Idem ca pique un peu.

    Une autre chose, mais c'est peut être moi, c'est quoi l’intérêt de çà ?
    Code :
    1
    2
    public int Answer { get; } = 42;
    Oui, dommage de ne pas avoir retenue la très élégante forme du Delphi ce qui aurait donné un truc du genre :

    Code :
    public int Answer { get; set; default=42};
  • tomlev
    Rédacteur/Modérateur
    @Tidus, autre exemple typique pour nameof :

    Code :
    1
    2
    3
    4
    5
    6
    7
    public void SayHello(string name)
    {
        if (name == null)
            throw new ArgumentNullException(nameof(name));
    
        Console.WriteLine($"Hello {name}");
    }
    L'avantage par rapport à new ArgumentNullException("name" est multiple :
    - l'Intellisense te propose le nom du paramètre
    - le compilateur vérifie que le nom que tu as mis correspond bien à quelque chose qui existe
    - les outils de refactoring sont capables de modifier l'instruction si tu renommes le paramètre.
  • Jabbal'H
    Membre confirmé
    Envoyé par worm83
    Bonjour,

    Merci pour cet article.

    J'aime bien dans l'ensemble les facilités apportées par cette nouvelle version.
    Le seul truc qui me fait "tické" est cela car je le trouve "brouillon". Le reste est très intéressante.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
      
      class Point(private readonly int x, private readonly int y) 
        { 
    
            public int X { get { return x; } } 
    
            public int Y { get { return y; } } 
    
        }
    Idem ca pique un peu.

    Une autre chose, mais c'est peut être moi, c'est quoi l’intérêt de çà ?
    Code :
    1
    2
    public int Answer { get; } = 42;
    C'est presque une constante, ou bien cela provient du fait de pouvoir faire çà
    Code :
    1
    2
    3
    4
    5
    6
    public class Point(int x, int y) 
    { 
        public int X { get; } = x; 
        public int Y { get; } = y; 
    }
    Pour le reste, de belles évolutions ! Vivement dans 5 ans qu'on puisse l'utiliser en entreprise :d
  • tomlev
    Rédacteur/Modérateur
    Envoyé par worm83
    Le seul truc qui me fait "tické" est cela car je le trouve "brouillon". Le reste est très intéressante.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
      
      class Point(private readonly int x, private readonly int y) 
        { 
    
            public int X { get { return x; } } 
    
            public int Y { get { return y; } } 
    
        }
    Dans ce cas précis ça n'a effectivement pas beaucoup d'intérêt, il serait plus simple de faire ça :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
      
      class Point(int x, int y) 
        { 
    
            public int X { get; } =x;
    
            public int Y { get; } = y;
    
        }
    Mais il peut y avoir des cas où c'est utile : par exemple si tu ne veux pas exposer le champ via une propriété, ça t'évite de faire un constructeur où tu dois explicitement initialiser le champ.

    Envoyé par Jabbal'H
    Une autre chose, mais c'est peut être moi, c'est quoi l’intérêt de çà ?
    Code :
    1
    2
    public int Answer { get; } = 42;
    C'est presque une constante
    C'est plutôt comme un champ public readonly en fait ; au niveau de la compilation, ce sera traité comme une propriété et non comme une constante. Surtout, ça permet de modifier l'implémentation plus tard si nécessaire sans changer l'interface publique de la classe : rien ne t'empêche à l'avenir de modifier la propriété pour renvoyer autre chose, et le code qui en dépend ne sera pas impacté.

    Envoyé par Jabbal'H

    ou bien cela provient du fait de pouvoir faire çà
    Code :
    1
    2
    3
    4
    5
    6
    public class Point(int x, int y) 
    { 
        public int X { get; } = x; 
        public int Y { get; } = y; 
    }
    Oui, c'est la possibilité d'initialiser une propriété auto et de pouvoir faire une propriété auto en lecture seule.

    Envoyé par Jabbal'H
    Pour le reste, de belles évolutions ! Vivement dans 5 ans qu'on puisse l'utiliser en entreprise :d
    Pas forcément ; comme je le disais dans la conclusion, même si tu cibles une version plus ancienne de .NET, la plupart de ces fonctionnalités sont quand même utilisables. J'ai testé en compilant pour .NET 2, tout marche sans problème (à part bien sûr ce qui est lié à async/await)
  • Reward
    Membre confirmé
    Bonjour Tidus.

    Non ce n'est pas pour faire de la réflexion.

    La réfléxion est évaluée lors de l'exécution.

    NameOf est évalué lors de la compilation.

    A quoi cela sert il ?

    Imagine que tu veuilles utiliser le nom d'une classe dans un log.

    Une solution simple consiste à écrire le nom dans le log, comme ceci : Console.WriteLine("MaClasse".

    Cependant, si tu changes le nom de ta classe, la refactorisation n'affectera pas la chaine de caractère que tu utilises dans le Console.WriteLine.

    C'est là que le NameOf s'avère utile. Tu peux désormais écrire : Console.WriteLine(NameOf(MaClasse). Avec cette méthode, si tu changes le nom de ta classe en MaClasseBis, le refactoring modifiera automatiquement le contenu du NameOf.
  • Reward
    Membre confirmé
    Je complète en disant que cela va générer le même code que dans la 1ere solution, mais ça sera plus propre.
  • worm83
    Membre éprouvé
    Envoyé par Jabbal'H


    Une autre chose, mais c'est peut être moi, c'est quoi l’intérêt de çà ?
    Code :
    1
    2
    public int Answer { get; } = 42;
    Je trouve cela pratique ça t'évite de faire cela :

    Code :
    1
    2
    3
    4
    5
    
    int _Answer = 42;
    
    public int Answer{get{return _Answer;}
    Ou d'écrire le constructeur sans argument pour initialiser Answer.
    Après sur une classe conséquente ça doit être un peu bordélique (remarque : pas plus que d'avoir pleins de membre privés initialisés à la déclaration ).
  • Jabbal'H
    Membre confirmé
    Ah oui effectivement, j'avais la tête ailleurs :d