Attributs génériques et plus — Visual Studio Magazine

Nouvelles

Fonctionnalités C# 11 en prévisualisation dans Visual Studio : attributs génériques et plus encore

Attributs génériques et plus — Visual Studio Magazine

Un nouveau billet « Quoi de neuf dans C# 11 » explique les nouvelles fonctionnalités disponibles en aperçu avec les derniers outils : NET 6.0.200 SDK ou Visual Studio 2022 v17.1.

Tout d’abord, la prise en charge des attributs génériques ou la possibilité de créer une classe générique basée sur System.Attribute. La classe Attribute permet d’associer des informations au code de manière déclarative, de sorte qu’un ObsoleteAttribute indique un code obsolète et ne doit plus être utilisé, signalant au compilateur de rechercher des instances de l’attribut et de faire quelque chose de correctif en réponse.

Une documentation Microsoft C# 10 pour les attributs génériques (la prise en charge a été reportée à C# 11) explique la motivation : “Actuellement, les auteurs d’attributs peuvent prendre un System.Type en tant que paramètre et demandez aux utilisateurs de passer un typeof expression pour fournir à l’attribut les types dont il a besoin. Cependant, en dehors des analyseurs, il n’y a aucun moyen pour un auteur d’attribut de restreindre les types autorisés à être transmis à un attribut via typeof. Si les attributs pouvaient être génériques, alors les auteurs d’attributs pourraient utiliser le système existant de contraintes de paramètres de type pour exprimer les exigences pour les types qu’ils prennent en entrée.”

Comme le montre le graphique ci-dessous, la prise en charge des attributs génériques n’est qu’une des nombreuses nouvelles fonctionnalités prévues pour C# :

Forfaits C#
[Click on image for larger view.] Forfaits C# (source : Microsoft).

La prise en charge des attributs génériques a été la réponse que l’expert C# Jason Bock a fournie à la question “Quelle est la fonctionnalité C# que vous souhaiteriez que Microsoft propose, mais qui ne s’est tout simplement pas concrétisée ?” dans l’article de septembre 2021 “Q&A with Jason Bock: What’s New in C# 10.”

“Attributs génériques”, a répondu Bock. “C’est une capacité que le CLR a depuis longtemps, mais elle n’a jamais été mise en évidence en C#. Vous pouvez définir des attributs génériques dans le langage intermédiaire de .NET — IL — et les consommer en C#, mais vous pouvez ‘ t les définir directement en C #. Il y a des cas où je pense que cette fonctionnalité serait utile, et j’espère qu’elle le fera en C # à un moment donné.

Ses souhaits se sont réalisés dans Visual Studio 17.1, où un développeur n’a qu’à définir sur “prévisualiser” pour activer les fonctionnalités de prévisualisation. Parmi ceux-ci, “Autoriser les attributs génériques” a été long à venir, en préparation depuis au moins cinq ans.

La nouvelle documentation “Quoi de neuf dans C# 11” vient de paraître le 11 mars fournit plus de détails sur sa manifestation imminente.

“Vous pouvez déclarer une classe générique dont la classe de base est System.Attribute. Cela fournit une syntaxe plus pratique pour les attributs qui nécessitent un paramètre System.Type. Auparavant, vous deviez créer un attribut qui prend un Type comme paramètre constructeur :”

// Before C# 11:
public class TypeAttribute : Attribute
{
  public TypeAttribute(Type t) => ParamType = t;

  public Type ParamType { get; }
}

Après avoir utilisé le tyepof opérateur pour appliquer l’attribut, un développeur peut créer un attribut générique et spécifier le paramètre de type pour utiliser la nouvelle fonctionnalité. Cependant, certaines constructions de code ne sont pas autorisées car lorsqu’un attribut générique est utilisé, il doit être complètement fermé. En d’autres termes, il ne peut contenir aucun paramètre de type. Voici quelques exemples :

  • Exemple 1:

    public class GenericType
        {
          [GenericAttribute()] // Not allowed! generic attributes must be fully constructed types.
          public string Method() => default;
        }
  • Exemple 2 :

    using System;
        using System.Collections.Generic;
        
        public class Attr : Attribute { }
        
        public class Program
        {
          [Attr] // error
          [Attr] // error
          void M() { }
        }>

En plus d’expliquer la motivation derrière l’approche, Microsoft énumère également un inconvénient du schéma : “Supprimer la restriction, analyser les implications et ajouter les tests appropriés est un travail.”

Une alternative est également répertoriée : “Les auteurs d’attributs qui souhaitent que les utilisateurs puissent découvrir les exigences des types qu’ils fournissent aux attributs doivent écrire des analyseurs et guider leurs utilisateurs pour qu’ils utilisent ces analyseurs dans leurs versions.”

Une question non résolue sur le régime se lit comme suit:

  • [x] Que signifie AllowMultiple = false signifie sur un attribut générique? Si nous avons [Attr] et [Attr] tous deux utilisés sur un symbole, cela signifie-t-il que “plusieurs” de l’attribut sont utilisés ?
    • Pour l’instant, nous sommes enclins à emprunter ici la voie la plus restrictive et à considérer la définition d’origine de la classe d’attributs pour décider si plusieurs d’entre elles ont été appliquées. Autrement dit, [Attr] et [Attr] appliqués ensemble sont incompatibles avec AllowMultiple = false.

      L’annonce du 11 mars note également que les arguments de type doivent satisfaire aux mêmes restrictions que les typeof et il répertorie certaines annotations de métadonnées non autorisées.

      Le message détaille également les membres abstraits statiques dans les interfaces, une fonctionnalité d’aperçu d’exécution également disponible avec ce paramètre : True.

      Vous pouvez ajouter membres abstraits statiques dans les interfaces pour définir des interfaces qui incluent des opérateurs surchargeables, d’autres membres statiques et des propriétés statiques », a déclaré Microsoft. « Le scénario principal de cette fonctionnalité consiste à utiliser des opérateurs mathématiques dans des types génériques. » Plus d’informations à ce sujet sont disponibles dans le didacticiel intitulé « Explorer ” membres de l’interface abstraite statique.”

      Alors que les attitudes des développeurs envers les attributs génériques semblent être principalement positives, à en juger par les commentaires de GitHub, d’autres fonctionnalités de prévisualisation de C# 11 dont Microsoft a discuté ont suscité beaucoup de colère des développeurs, en particulier la vérification des paramètres nuls. En savoir plus à ce sujet dans l’article “Devs Sound Off on C# 11 Preview Features Like Parameter Null Checking”.

      A propos de l’auteur

      David Ramel est éditeur et rédacteur pour Converge360.

      .

      Leave a Comment