IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Microsoft livre un aperçu des nouveautés de C# 8.0


Sujet :

C#

  1. #1
    Chroniqueur Actualités

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2013
    Messages
    8 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mars 2013
    Messages : 8 911
    Points : 206 582
    Points
    206 582
    Par défaut Microsoft livre un aperçu des nouveautés de C# 8.0
    Microsoft a dévoilé la feuille de route de C # 7.1, C # 7.2 et C # 8.0,
    et propose quelques améliorations à son langage

    C # 7.1

    async Task Main()

    Les mots clés async et await, qui ont été apportés par C # 5.0 facilitent l’écriture du code qui appelle des systèmes externes, ou fait des E/S, sans bloquer un thread. Cela rend les applications Web évolutives et conserve la réactivité des IU d’applications.

    Cependant, une fois qu'une partie de votre code est asynchrone, tout ce qui implique ce code doit également devenir asynchrone. Lorsque votre application d'hébergement est une application de console ou un service Windows, cela pose un problème. Vous pouvez écrire async void Main, mais cela signifie que, dès que vous arrivez à votre premier await, l’application entière se termine.

    La raison ? async void, qui agit comme un mécanisme de prévention des incendies. Étant donné que vous ne pouvez pas retourner une Task de Main, vous devrez utiliser quelque chose comme AsyncContext depuis la bibliothèque AsyncEx.

    Microsoft explique que cela ne sera plus nécessaire : le compilateur et le framework reconnaîtront et exécuteront correctement une méthode Async Task Main.

    Les expressions default :

    Il s'agit simplement d'une amélioration de quelque chose qui a été supporté depuis C # 2.0 et l'avènement des génériques, en 2005. Il est sous forme de default (T), où T est bien sûr un type. Pour les types de référence, il représente null, et pour les types de valeurs tels que int, il représente la valeur par défaut, non initialisée, de ce type.

    La nouvelle fonctionnalité est que, lorsque le type de T peut être déduite, il n'est plus nécessaire de le spécifier.

    En clair, au lieu d’écrire ceci

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    int x = default(int);

    Vous pourrez écrire ceci


    Bien sûr, cela s'étend également à d'autres usages de default, tels que les déclarations de retour, les valeurs par défaut pour les arguments, et, en développant le point précédent, les expressions ternaires.

    Pour illustrer, ceci sera valide dans une future version de C #

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    var x = flag ? 1: default;
    :
    Déduction des tuples

    Supposons que vous voulez créer le tuple (string Nom, string Prenom) et que vous avez déjà des variables locales appelées Nom et Prenom. Vous devez écrire quelque chose comme ceci :
    var t = (fNom: Prenom, SecondNom: SecondPrenom);Cette fonctionnalité va déduire les noms des éléments de tuple à partir de leur expression d'initialisation, un peu comme ce que vous pouvez faire avec des types anonymes.

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var t = (Nom, SecondNom);
     
    Console.WriteLine($"Salut, {t.Nom}!");

    C # 7.2

    Références read-only

    Ici, il s’agit de donner à C # la possibilité d'utiliser des paramètres const-like pour améliorer les performances. Connu sous le nom de « paramètres réellement définis » ou « paramètres » simples, ceux-ci permettent de transmettre de grandes structures par référence tout en ne permettant pas qu'elles soient mutées.

    C # 8.0

    Types de référence nullables

    L'équipe responsable du développement de C # a, pour l'instant, choisi de faire en sorte que tous les types de référence deviendront non annulables par défaut, et vous pouvez faire en sorte qu’un type de variable soit nullable en vous servant de “?”. L'utilisation d'une variable non nulle qui pourrait être nulle (car vous ne l'avez pas vérifiée si elle avait déjà pris cette valeur) entraînera un avertissement, tout en attribuant la valeur d'une variable nulle à celle qui n'est pas nullable.

    Petit exemple d’illustration

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // bar est nullable parce que son type est string?
    void Foo(string? bar)  
    {
        string baz = bar; 
        // ceci va générer un avertissement parce que baz est non-nullable 
        // mais bar est nullable
    }
    Pour résoudre ce problème, il suffit de vérifier que bar n’est pas null

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void Foo(string? bar)  
    {
        if (bar == null)
            throw new ArgumentNullException(nameof(bar));
     
        string baz = bar; 
    }

    Source : feuille de route

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    A noter que si les choses sont à peu près figées pour C# 7.1, ce n'est pas le cas pour les versions suivantes (les features sont encore à l'état de proposition ou de prototype).

    Une autre feature très intéressante envisagée pour C# 8, c'est les méthodes par défaut dans les interfaces, un peu comme en Java 8. Ça permet de mettre dans une interface une méthode avec une implémentation. L'intérêt est multiple :
    • une classe qui implémente l'interface n'est pas obligée d'implémenter elle-même ces méthodes, puisqu'une implémentation par défaut existe
    • une classe qui implémente l'interface peut redéfinir ces méthodes, par exemple si elle peut en faire une implémentation plus efficace que celle par défaut
    • on peut ajouter des méthodes par défaut à une interface sans que ce soit un breaking change (normalement, ajouter un membre à une interface d'une API publique est un breaking change, puisque les classes qui implémentent déjà l'interface doivent être modifiées)
    • ça apporte à C# une forme allégée d'héritage multiple (allégée car une interface ne peut pas déclarer de champs, seulement des méthodes, propriétés ou événements)

  3. #3
    Membre émérite
    Profil pro
    retraité
    Inscrit en
    Décembre 2010
    Messages
    831
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Décembre 2010
    Messages : 831
    Points : 2 387
    Points
    2 387
    Par défaut
    Citation Envoyé par tomlev Voir le message
    A noter que si les choses sont à peu près figées pour C# 7.1, ce n'est pas le cas pour les versions suivantes (les features sont encore à l'état de proposition ou de prototype).

    Une autre feature très intéressante envisagée pour C# 8, c'est les méthodes par défaut dans les interfaces, un peu comme en Java 8. Ça permet de mettre dans une interface une méthode avec une implémentation. L'intérêt est multiple :
    • une classe qui implémente l'interface n'est pas obligée d'implémenter elle-même ces méthodes, puisqu'une implémentation par défaut existe
    • une classe qui implémente l'interface peut redéfinir ces méthodes, par exemple si elle peut en faire une implémentation plus efficace que celle par défaut
    • on peut ajouter des méthodes par défaut à une interface sans que ce soit un breaking change (normalement, ajouter un membre à une interface d'une API publique est un breaking change, puisque les classes qui implémentent déjà l'interface doivent être modifiées)
    • ça apporte à C# une forme allégée d'héritage multiple (allégée car une interface ne peut pas déclarer de champs, seulement des méthodes, propriétés ou événements)
    En gros il refont ce qui existe déjà avec les classes abstraites en C++. Je ne connais pas C# mais sauf erreur de ma part Java avait rajouté la généricité, la création des opérateurs...à la longue il faut faire gaffe cela va devenir du C++

  4. #4
    Membre confirmé Avatar de WaterTwelve21
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2015
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2015
    Messages : 270
    Points : 461
    Points
    461
    Par défaut
    Je ne connais pas C# mais sauf erreur de ma part Java avait rajouté la généricité, la création des opérateurs...à la longue il faut faire gaffe cela va devenir du C++
    Peut-être que c'est parce que ca fait bien longtemps que la généricité et la création des opérateurs ont été mis en place. Avec c#7 il n'y a pas de révolutions à proprement parler mais on ressent la volonté de toujours améliorer le quotidien du developpeur et puis les tuples les méthodes aux retour multiple etc ... c'est quand même pas mal.

    C'est presque dommage que ca aille si vite ( ou que les entreprises ne suivent pas ) .

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    468
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 468
    Points : 689
    Points
    689
    Par défaut
    Bonjour j'aimerai bien savoir ce que vous penseriez d'une amélioration de langage bien plus souple et puissante concurrente à la gestion des exceptions et des variables de sorties 'out' ?

    A mon avis ces méthodes classiques :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    int Parse(string s)
    {
      if(...) return 42;
      throw new Exception(...)
    }
     
    int Parse(string s, int defaut_val)
    {
      if(...) return 42;
      return defaut_val;
    }
     
    bool TryParse(string s, out int i)
    {
      if(...) { i = 42; return true; }
      i = default(int); return false;
    }

    Pourraient être avantageusement remplacées par une seule :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int MyParse(string s) | void MyError()
    {
      if(...) MyParse.return 42;
      MyError.return;
    }

    Et pouvant s'utiliser comme cela :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int i0 = MyParse("42"); // lancerait une exception classique en cas où la sortie "MyError" serait atteinte
     
    int i1 = MyParse("42") | MyError() -1; // renvoie -1 en cas parsage incorrecte - dans tous les cas aucune exception créée
     
    MyParse("42")->(int i2)
    {
      // sortie ici en cas de parsage correcte - 'i2' est visible naturellement qu'ici
    }
    |MyError() // sortie facultative 
    {
      // sortie ici en cas de parsage incorrecte - évidemment aucune exception créée non plus 
    }

    Ne trouverez vous pas cela plus efficace ?

  6. #6
    Membre éprouvé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Août 2014
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Août 2014
    Messages : 476
    Points : 1 043
    Points
    1 043
    Par défaut
    A quand des outils RAD comme Delphi comme ca avait existé il y a bien longtemps et qui permettait a quiconque de "programmer" rapidement sans se prendre la tete ?
    En 2017 on galere toujours autant a developper des applis avec IHMs (asp.net ou mobile ou desktop).
    Alors certes les langages evoluent dans leur syntaxe mais au final ce qu'on vend au client c'est un fonctionnel et je constate qu'on n'est pas plus performant en 2017 qu'en 1990 pour developper des applis IHMs (qu'on ait eu a ecrire 3 lignes de codes au lieu de 2 n'est pas une fin en soi, qu'on code du portable ou du modulaire, et a la techno suivante on jette tout et on recommence (ex: experience silverlight/wpf)).
    Dev ASM/C/C++ au depart je vois que les evolutions des langages frisent quelques fois a l'inutilité (ex : auto en C++) voir des anti patterns.

    Je sais que c'est propre au developpeur (j'en suis un) de jouer avec les technos/langages et defaire/refaire regulierement la meme chose ... mais differemment mais au final on s'occupe plutot qu'autre chose. Certes apres 30 ans de dev j'ai un peu perdu tout espoir et je vois beaucoup de choses produites mais au final ca se resume souvent a 'tout ca pour ca'.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par ijk-ref Voir le message
    Bonjour j'aimerai bien savoir ce que vous penseriez d'une amélioration de langage bien plus souple et puissante concurrente à la gestion des exceptions et des variables de sorties 'out' ?
    J'en pense que tu avais déjà mentionné cette idée il y a quelques mois, que j'avais trouvé que c'était une très mauvaise idée, et que mon avis n'a pas changé depuis . D'une part parce que c'est incompréhensible, et d'autre part parce que ce n'est pas du tout cohérent avec la syntaxe existante du langage.

    D'ailleurs en C# 7 on peut déjà faire des choses tout à fait propres et lisibles pour ce genre de situation :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (TryParse("42", out var i))
    {
        // i vaut 42
    }
    else
    {
        ...
    }

    Tu peux toujours aller proposer ton idée sur Github, mais je doute qu'elle soit accueillie très favorablement...

  8. #8
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    J'avais pas très bien compris le "ckeck nullable" de c# 8, tel que tu l'avais présenté.

    Le but n'est pas réellement de forcer les référence a ne plus être nullable, comme je l'ai compris dans ton papier (ce qui serait une hérésie), mais de forcer les développeur à vérifier le fait que celle-ci n'est pas "null".

    Et pour le coup c'est très intéressant lorsque l'on monte une archi/Framework, en appliquant certaines convention à l'équipe, on peut forcer à appliquer une programmation "défensive" sur certains socle de l’application, ou au contraire laisser sous-entendre entendre que la valeur et les limites de celle-ci a déjà été vérifiée via les signatures d'interface et éviter une revérifications des limites.

    Le langage suit une bonne évolution.

    Concernant ta proposition ijk-ref, je suis de l'avis de Tom, pas du tout intéressé.


    Merci pour ce post tom.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    468
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 468
    Points : 689
    Points
    689
    Par défaut
    Tomlev et Worm83 merci pour m'avoir au moins donné votre avis - vous Même si j'aurai aimé un peu plus d'enthousiaste

    Citation Envoyé par tomlev Voir le message
    J'en pense que tu avais déjà mentionné cette idée il y a quelques mois, que j'avais trouvé que c'était une très mauvaise idée, et que mon avis n'a pas changé depuis .
    Non personne ne m'avait encore donné son avis sur cette idée. C'en était une autre beaucoup moins 'aboutie' et générale.


    Citation Envoyé par tomlev Voir le message
    D'une part parce que c'est incompréhensible, et d'autre part parce que ce n'est pas du tout cohérent avec la syntaxe existante du langage.
    Incompréhensible !? La seule différence de code est le remplacement des "throw new Exception" par des "return nommé". La syntaxe ne change absolument pas si on utilise ces méthodes 'classiquement'. Ensuite il faut bien partir sur une nouvelle syntaxe si l'on souhaite accéder aux différentes "sorties".

    Du point de vue du compilateur c'est informativement plus précis... contrairement justement au "if (TryParse("42", out var i))" qui est (bien sur) humainement lisible mais bien moins efficace pour le compilateur. De plus ceci ne fait pas ce que l'on souhaite : retourner une valeur dans la portée de sa validité - ce que ne permettra jamais un "if-methode-out" puisque ce n'est que du bidouillage.

    Mais p'être que je devrais m'y prendre autrement pour me faire comprendre.

    Imaginez que vous aillez besoin d'une "méthode" devant retourner 1 valeur... mais pouvant être de 3 types différents... et qu'en bon "autiste" adepte du typage fort vous aimeriez avoir les outils pour que ce soit le compilateur qui se charge de cette vérification... quelle syntaxe aimeriez-vous avoir à votre disposition pour parfaire ce fantasme ?

    Je vous montre la mienne :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Event0(mouseMove)->(var r)
    {
      label.Content = "location : " + r.GetPosition(this);
    }
    |Event1(mouseDown)->(var r)
    {
      label.Content = "button : " + r.MouseButton;                
    }
    |Event2(keyDown)->(var r)
    {
      label.Content = "key : " + r.Key;                
    }

    Remplaçant avantageusement :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    var (index, result) = MyEvents(mouseMove, mouseDown, keyDown);
    switch (index)
    {
      case 0:
      {
        var r = (MouseEventArgs)result;
        label.Content = "location : " + r.GetPosition(this);
      }
      break;
      case 1:
      {
        var r = (MouseButtonEventArgs)result;
        label.Content = "button : " + r.MouseButton;
      }
      break;
      case 2:
      {
        var r = (KeyEventArgs)result;
        label.Content = "key : " + r.Key;
      }
      break;
    }

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par ijk-ref Voir le message
    Imaginez que vous aillez besoin d'une "méthode" devant retourner 1 valeur... mais pouvant être de 3 types différents... et qu'en bon "autiste" adepte du typage fort vous aimeriez avoir les outils pour que ce soit le compilateur qui se charge de cette vérification... quelle syntaxe aimeriez-vous avoir à votre disposition pour parfaire ce fantasme ?

    Je vous montre la mienne :
    Pourquoi un "index" pour représenter le type ?

    Moi je te montre la mienne :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var result = MyEvents(mouseMove, mouseDown, keyDown);
    switch (result)
    {
      case MouseButtonEventArgs r:
        label.Content = "button : " + r.MouseButton;
        break;
      case MouseEventArgs r:
        label.Content = "location : " + r.GetPosition(this);
        break;
      case KeyEventArgs r:
        label.Content = "key : " + r.Key;
        break;
    }

    C'est du C# 7, on peut déjà faire ça aujourd'hui sans inventer une nouvelle syntaxe bizarre.

    Donc non, je suis toujours pas convaincu...

    (note que j'ai réordonné les cases, parce que MouseButtonEventArgs hérite de MouseEventArgs, donc si MouseEventArgs est avant, il chopera aussi les MouseButtonEventArgs... c'est comme avec les catch, il faut intercepter l'exception la plus spécifique en premier)

    Remplaçant avantageusement :
    C'est très discutable... tu as le droit de préférer ça, mais personnellement je trouve ça affreux, et ça ne ressemble même pas à du C#.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    468
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 468
    Points : 689
    Points
    689
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Pourquoi un "index" pour représenter le type ?
    Parce que rien n'empêche d'utiliser des évènements différents retournant le même type demandant chacun son traitement particulier.

    Citation Envoyé par tomlev Voir le message
    C'est du C# 7, on peut déjà faire ça aujourd'hui sans inventer une nouvelle syntaxe bizarre.
    Non C# 7 ne permet absolument de faire cela. Par contre ma syntaxe permettrait de coder nous-même des outils aussi puissants que ce nouveau switch.

    Citation Envoyé par tomlev Voir le message
    Donc non, je suis toujours pas convaincu...

    (note que j'ai réordonné les cases, parce que MouseButtonEventArgs hérite de MouseEventArgs, donc si MouseEventArgs est avant, il chopera aussi les MouseButtonEventArgs... c'est comme avec les catch, il faut intercepter l'exception la plus spécifique en premier)
    Super, tout ce qu'il est souhaitable d'éviter pour un traitement d'évènements (ou de messages etc...)

    Dans la réalité t'auras surement une boucle de massages plus conséquente à traiter. Ma méthode permet d'en insérer une naturellement à la suite des autres sans cette erreur de typage possible. De plus chaque traitement est avec sa déclaration. Faut être un peu de mauvaise foi pour préférer avoir toutes les déclarations au début et s'y retrouver sans erreur dans les traitements suivants - qui ne seront pas toujours comme notre exemple basique avec des types de retour uniques et aussi lisibles.

    Citation Envoyé par tomlev Voir le message
    C'est très discutable... tu as le droit de préférer ça, mais personnellement je trouve ça affreux, et ça ne ressemble même pas à du C#.
    Drôle d'argument, les requêtes Linq, les expressions lambda ne ressemblaient pas plus à du C#

    Après même si je trouve une certaine élégance et concision à ma syntaxe, n'hésite à faire une proposition si t'en penses une plus claire - ayant au moins les mêmes avantages

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par ijk-ref Voir le message
    Faut être un peu de mauvaise foi
    Merci d'éviter les attaques personnelles. Ce n'est pas parce que je ne suis pas d'accord avec toi que je suis de mauvaise foi. Tu as le droit de préférer ta syntaxe, et moi j'ai le droit de la trouver toute pourrie. Si tu veux forker le compilateur C# pour implémenter ça, libre à toi...

    Pour ma part, j'ai dit ce que j'avais à dire sur ce sujet, et si c'est pour que ma bonne foi soit remise en cause, je n'ai aucune envie de continuer cette discussion.

  13. #13
    Membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2010
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2010
    Messages : 65
    Points : 51
    Points
    51
    Par défaut usage
    Un langage humain est créé par l'usage, il n'est pas imposé par des académiciens.

    Je pense qu'il devrait en être de même pour les langages informatiques, ça eu été comme disait Fernand Raynaud.
    On discute entre potes, et si une idée est bonne, elle est adoptée.

    L'académie peut prếcher qu'on a le droit de mettre des zonions dans les zaricots, mais si tout le monde trouve ça débile et moche, quel intérêt ?

    Je ne trouve aucune légitimité à Microsoft pour parler d'informatique.
    Microsoft a été sponsorisé par Rockfeller pour prendre le contrôle de l'IT.
    Bill Gates signe William H Gates III.
    Lui même fils de William H Gates II.
    Lui même fils de William H Gates I déjà pote avec le vieux Rockfeller.
    Il n'a jamais rien inventé dans son garage, surtout pas l'informatique ;-)

  14. #14
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    Dans l'exemple C# 8.0, quel est l'intérêt de déclarer un string? alors que le type string est déjà nullable par défaut ?

  15. #15
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    Citation Envoyé par SLE Voir le message
    Dans l'exemple C# 8.0, quel est l'intérêt de déclarer un string? alors que le type string est déjà nullable par défaut ?
    Comme je l'ai dit précédemment :

    Le but n'est pas réellement de forcer les référence a ne plus être nullable, comme je l'ai compris dans ton papier (ce qui serait une hérésie), mais de forcer les développeur à vérifier le fait que celle-ci n'est pas "null".

    On force une programmation défensive en quelque sorte.

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par SLE Voir le message
    Dans l'exemple C# 8.0, quel est l'intérêt de déclarer un string? alors que le type string est déjà nullable par défaut ?
    Parce que string tout seul signifiera par défaut un string qui ne peut pas être null.

  17. #17
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    C'est valable que pour string ou pour toutes les classes ?

  18. #18
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    C'est valable que pour string ou pour toutes les classes ?
    Toutes les classes.

    Évidemment ce comportement sera optionnel, sinon ça pèterait tout le code existant...

  19. #19
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Évidemment ce comportement sera optionnel, sinon ça pèterait tout le code existant...
    c'est l'info qui me manquait pour voir que ce n'était pas absurde
    comme quoi lire la source est souvent pratique ^^

  20. #20
    Chroniqueur Actualités
    Avatar de Michael Guilloux
    Homme Profil pro
    Data Consultant
    Inscrit en
    Juillet 2013
    Messages
    2 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Data Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 2 939
    Points : 88 211
    Points
    88 211
    Billets dans le blog
    2
    Par défaut Microsoft livre un aperçu des nouveautés de C# 8.0
    Microsoft livre un aperçu des nouveautés de C# 8.0
    et envisage de commencer à livrer cette version dans les préversions de Visual Studio 2019

    C# 8.0, la prochaine version majeure du langage C# de Microsoft est en préparation depuis un certain temps. Le plan de l'entreprise est que C# 8.0 soit livré en même temps que .NET Core 3.0. Toutefois, les fonctionnalités de la nouvelle version du langage commenceront à être livrées dans les préversions de Visual Studio 2019, la prochaine version majeure de l'EDI phare de Microsoft sur laquelle la firme travaille également.

    En attendant, Microsoft a décidé de donner, dans un billet de blog, un aperçu des nouveautés de C# 8.0 pour permettre aux développeurs de savoir à quoi s'attendre.


    Nouvelles fonctionnalités de C# 8.0

    Types de références nullables

    Les types de références nullables constituent l'une des fonctionnalités les plus importantes de C# 8.0. Le but de cette fonctionnalité est d'en finir avec les exceptions de référence null très fréquentes. Pour cela, elle vous empêche de mettre null dans des types de référence ordinaire comme string. Autrement dit, par défaut, ces types seront non nullables ! Mais vous pouvez faire en sorte qu’un type de variable soit nullable en vous servant de "?".

    Cette fonctionnalité devrait donc casser le code existant. Un problème que Microsoft a décidé de gérer en douceur en générant des avertissements et non des erreurs. Toujours est-il qu'un code propre d'aujourd'hui pourra se retrouver avec des milliers d'avertissements demain. Vous devez donc choisir d'utiliser la fonctionnalité (ce que vous pouvez faire au niveau du projet, du fichier ou même de la ligne de code source).

    Pour illustrer la fonctionnalité, le code suivant va générer un avertissement puisque vous essayez d'assigner un null à un type non nullable :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    string s = null; // Warning: Assignment of null to non-nullable reference type

    Si vous voulez le rendre null, vous pouvez utiliser le type de référence nullable associé, c'est-à-dire ici string? :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    string? s = null; // Ok

    Les flux asynchrones

    La fonctionnalité async/wait de C# 5.0 vous permet d'utiliser (et de produire) des résultats asynchrones sous forme de code simple, sans callback. Toutefois, comme l'explique Microsoft, elle n'est pas très utile si vous souhaitez utiliser (ou produire) des flux continus de résultats, tels que ceux que vous pouvez obtenir d'un appareil IoT ou d'un service cloud. Les flux asynchrones sont donc là pour ça. Microsoft introduit IAsyncEnumerable<T>, qui correspond exactement à ce à quoi vous vous attendiez : une version asynchrone de IEnumerable<T>.

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    async IAsyncEnumerable<int> GetBigResultsAsync()
    {
        await foreach (var result in GetResultsAsync())
        {
            if (result > 20) yield return result; 
        }
    }

    Les types Range et Index

    Microsoft a ajouté un type Index, qui peut être utilisé pour l’indexation. Vous pouvez en créer un à partir d'un intqui permet de compter depuis le début, ou avec un opérateur de préfixe ^ qui permet de compter depuis la fin.

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Index i1 = 3;  // number 3 from beginning
    Index i2 = ^4; // number 4 from end
    int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    Console.WriteLine($"{a[i1]}, {a[i2]}"); // "3, 6"

    Microsoft introduit également un type Range, composé de deux index, un pour le début et un pour la fin.

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    var slice = a[i1..i2]; // { 3, 4, 5 }

    Autres nouveautés et dépendances de plateforme

    C# introduit aussi les modèles récursifs (les modèles contenant d'autres modèles), et l'implémentation par défaut des membres d'une interface. Dans le dernier cas notamment, aujourd’hui, une fois que vous publiez une interface, vous ne pouvez pas ajouter de membres sans casser tous les implémenteurs existants, explique Microsoft. Dans C# 8.0, la firme vous permet de fournir un corps pour un membre d'interface. Ainsi, si quelqu'un n'implémente pas ce membre (peut-être parce qu'il n'était pas encore là quand il a écrit son code), il obtient simplement l'implémentation par défaut.

    C# 8.0 viendra aussi avec les expressions Switch. Microsoft explique que les instructions Switch avec des modèles sont assez puissantes dans C# 7.0, mais peuvent être fastidieuses à écrire. Les expressions Switch viennent donc comme une version « légère », où tous les cas sont des expressions.

    Une nouvelle fonctionnalité vous permettra d'omettre les types dans de nombreux cas. Lorsque vous créez un nouvel objet, le type est parfois déjà fourni à partir du contexte. Dans ces situations, le langage de Microsoft vous laissera omettre le type.

    La plupart des fonctionnalités de C# 8.0 s’appliqueront à n’importe quelle version de .NET. Cependant, quelques-unes de ces fonctionnalités dépendent de certaines plateformes et seront spécifiques à .NET Standard 2.1. Il s'agit des flux asynchrones, des types Index et Range qui reposent tous sur de nouveaux types qui feront partie de .NET Standard 2.1. Si .NET Core 3.0 ainsi que Xamarin, Unity et Mono implémenteront complètement .NET Standard 2.1, .NET Framework 4.8 ne le fera pas. Cela signifie que les types requis pour utiliser ces fonctionnalités ne seront pas disponibles lorsque vous ciblerez C# 8.0 sur .NET Framework 4.8. Les implémentations par défaut des membres d’interface reposent aussi sur de nouvelles améliorations de runtime, et Microsoft ne les apportera pas non plus dans .NET Runtime 4.8. Donc, cette fonctionnalité ne fonctionnera tout simplement pas sur .NET Framework 4.8 et sur les anciennes versions de .NET.

    Source : Blog Microsoft

    Et vous ?

    Que pensez-vous des nouveautés de C# 8.0 et du fait que certaines ne fonctionneront pas sur .NET Framework 4.8 ?
    Qu'attendez-vous encore comme fonctionnalités dans le langage de Microsoft ?

    Voir aussi :

    Visual Studio Code 1.29 est disponible : aperçu des nouveautés dans l'éditeur de code open source et multiplateforme de Microsoft
    Microsoft livre un aperçu des changements de l'expérience et l'interface utilisateur dans Visual Studio 2019, la prochaine version majeure de son EDI
    Microsoft annonce que ASP.NET Core 3.0 fonctionnera uniquement sur .NET Core 3.0 et ne sera plus compatible avec la plateforme .NET Framework
    Project Roslyn : comment Microsoft a réécrit son compilateur C# en C# et l'a rendu open source, le lead designer du langage raconte l'histoire
    MonoGame, le framework C# pour le développement de jeux vidéo arrive en version 3.7

Discussions similaires

  1. Microsoft dévoile la feuille de route de son service Cloud OneDrive
    Par Stéphane le calme dans le forum Cloud Computing
    Réponses: 3
    Dernier message: 12/01/2015, 14h21
  2. Microsoft dévoile la feuille de route d'Office 365 version entreprise
    Par Stéphane le calme dans le forum Microsoft Office
    Réponses: 0
    Dernier message: 20/06/2014, 19h42
  3. BizTalk Server 2010 R2 : Microsoft dévoile la feuille de route
    Par Hinault Romaric dans le forum Microsoft BizTalk Server
    Réponses: 0
    Dernier message: 09/12/2011, 11h17
  4. Réponses: 15
    Dernier message: 04/10/2010, 08h52
  5. Réponses: 0
    Dernier message: 22/04/2010, 19h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo