Nouvelles
Devs Sound Off on C# 11 Preview Fonctionnalités telles que la vérification des paramètres Null
Un aperçu des prochaines fonctionnalités de prévisualisation de C # 11 a suscité la colère des développeurs, en particulier sur la vérification des paramètres nuls.
Microsoft a publié cette semaine un premier aperçu des fonctionnalités de C # 11 qui détaillaient les constructions d’aperçu telles que les modèles de liste, un ajustement affectant les nouvelles lignes dans les chaînes interpolées et la vérification des paramètres nuls.
Le fév. 22 messages ont rapidement conduit à un nombre inhabituellement élevé de commentaires, dont beaucoup étaient négatifs et, au sein de ce groupe, beaucoup se sont concentrés sur ce dernier élément, la vérification du paramètre nul.
Cette proposition de fonctionnalité d’aperçu découle de l’introduction par C# 8 des types de référence nullables (NRT), qui se sont avérés controversés en soi.
La proposition Parameter Null Checking sur GitHub indique : “Cette proposition fournit une syntaxe simplifiée pour valider les arguments de méthode qui ne sont pas null
et lancer ArgumentNullException
de manière appropriée.
La motivation derrière la proposition se lit comme suit : “Le travail sur la conception de types de référence nullables nous a amenés à examiner le code nécessaire à la validation des arguments nuls. Étant donné que NRT n’affecte pas l’exécution du code, les développeurs doivent encore ajouter if (arg is null) throw
code de plaque de chaudière même dans les projets qui sont entièrement null
nettoyer. Cela nous a donné le désir d’explorer une syntaxe minimale pour l’argument null
validation dans la langue. Alors que ce null
La syntaxe de validation des paramètres est censée s’associer fréquemment avec NRT, la proposition en est totalement indépendante. La syntaxe peut être utilisée indépendamment de #nullable
directives.”
En effet, il simplifie le code nécessaire en utilisant ce que Microsoft appelle “l’opérateur bang-bang” ou “!!
.”
Ainsi l’ancienne façon de vérifier:
public static void Hello(string name) { if (name is null) { throw new ArgumentNullException(nameof(name)); } Console.WriteLine("Hello, " + name); }
ou l’alternative .NET 6 :
public static void Hello(string name) { ArgumentNullException.ThrowIfNull(name); Console.WriteLine("Hello, " + name); }
peut devenir simplement :
public static void Hello(string name!!) { // Body of the method }
qui est ensuite transformé en quelque chose comme ceci via la génération de code :
void Hello(string name) { if (name is null) { throw new ArgumentNullException(nameof(name)); } ... }
“Nous intégrons cette fonctionnalité dans cet aperçu précoce pour nous assurer d’avoir le temps d’obtenir des commentaires”, a déclaré la responsable principale du programme, Kathleen Dollard, dans le message d’hier. “Il y a eu des discussions sur une syntaxe très succincte par rapport à une syntaxe plus détaillée. Nous souhaitons obtenir les commentaires des clients et des utilisateurs qui ont eu l’occasion d’expérimenter cette fonctionnalité.
“Le code sera généré pour effectuer la vérification nulle. La vérification nulle générée s’exécutera avant tout code dans la méthode. Pour les constructeurs, la vérification nulle se produit avant l’initialisation du champ, les appels aux constructeurs de base et les appels à ces constructeurs.”
Pour une fonctionnalité de prévisualisation aussi anodine, elle a généré plusieurs commentaires négatifs (non édités) du type :
- Je n’aime pas la fonction de vérification des paramètres nuls. Cela ne semble pas être un bon ajout à la langue et a déjà causé beaucoup de guerres saintes. Pourquoi introduisez-vous une nouvelle syntaxe pour cela ? Pourquoi vous ne pouvez pas utiliser l’existant
notnull
mot-clé sur le type, pas sur le nom du paramètre ? Pourquoi utilisez-vous!!
sur le nom du paramètre ? Cela contredit même la fonctionnalité NRT, où la validation stricte de null peut être ajoutée. - Mettre le
!!
sur le paramètre plutôt que sur le type convient ici puisque c’est la valeur du paramètre qui est vérifiée. Les choses qui vont avec le type ne devraient être là que si elles décrivent quelque chose à propos du type. Il n’y a aucun type ailleurs qui puisse êtrestring!!
oustring?!!
. Cela dit, il semble un peu ridicule et déplacé qu’une incantation spéciale à deux caractères de ponctuation soit introduite juste pour lever une certaine exception. - Je suis d’accord. Le projet NRT est un succès donc cette fonctionnalité n’est pas nécessaire. Si un projet consommateur a désactivé NRT, c’est son problème.
- Je suis d’accord
!!
la syntaxe est laide comme l’enfer. Il ajoute du bruit au code, il n’est pas explicite et rend les nouveaux arrivants submergés (comme F #, qui contient de nombreux pièges de syntaxe et possède l’une des syntaxes les plus laide jamais produites). - Pourquoi
!!
du tout? Si le paramètre est nullable et qu’il n’y a pas de vérification/branche explicite pournull
dans le code, la génération d’exceptions peut être implicite. Le mode avancé peut vérifier que tous les appels pour ce membre privé/interne ont déjà été vérifiésnull
et sautez-le pour réduire le nombre de chèques.
Il y en a d’autres, mais vous voyez l’idée.
Un article détaillé traitait uniquement de la génération de code :
Générer automatiquement un tel code serait une très mauvaise idée. Par conséquent, ce n’est vraiment pas une option. Je peux penser à plusieurs cas où la génération automatique d’un tel code sans invite du développeur ne fonctionnerait pas bien.
- Certaines méthodes ne doivent pas lancer un ANE sur null mais NRE. Le cas d’utilisation ici est une méthode d’extension car ils doivent se comporter comme des membres d’instance. Les membres d’instance ne lancent pas ANE mais NRE. Mais vous ne devriez pas lancer un NRE vous-même, donc la seule façon de le faire fonctionner correctement est de référencer l’instance.
- Dans de nombreux cas, les méthodes de niveau supérieur valident déjà les arguments et, par conséquent, les méthodes de niveau inférieur ne doivent pas effectuer de vérification automatique également. C’est du gaspillage et il n’y a aucun moyen de savoir si un tel cas existe ou non avec une simple déclaration de méthode.
- L’accessibilité n’a pas d’importance en termes de “déjà vérifié”. Si vous pouviez même faire une telle analyse (et s’il y a des cas où les arguments sont vérifiés et d’autres non), ce n’est toujours pas fiable. Par exemple, une méthode, sans rapport avec l’accessibilité, peut être transmise en tant que délégué à un autre code. Il n’y a aucun moyen de faire une analyse de code et de détecter cela. Par conséquent, vous devrez proposer des heuristiques pour déterminer quand activer/désactiver une telle fonctionnalité (par exemple, l’accessibilité), ce qui la rend beaucoup plus difficile à comprendre. Ce serait également alors un changement de rupture pour changer l’accessibilité d’une méthode (actuellement ce n’est généralement pas le cas si vous passez de plus restrictif à moins).
- Enfin, ce serait un changement radical de commencer soudainement à lancer ANE dans du code qui ne le faisait pas auparavant. Quelqu’un quelque part pourrait envelopper ce code dans des gestionnaires d’exceptions typés et verrait soudainement un comportement différent.
La génération automatique de code sans qu’un programmeur n’indique qu’il le souhaite est presque toujours une mauvaise idée. Il doit toujours être opt-in.
Vous pouvez trouver dans le billet de blog beaucoup plus de commentaires et beaucoup plus de raisonnement derrière la fonctionnalité de prévisualisation proposée et les autres mentionnées ci-dessus, qui ont été publiées pour recueillir les commentaires des développeurs. En plus de la section des commentaires de son article, Dollard recommande la zone de discussion du référentiel CSharpLang GitHub pour fournir de tels commentaires.
Notez que pour essayer les nouvelles fonctionnalités, vous devez utiliser Visual Studio 17.1 et .NET SDK 6.0.200 et définir LangVersion
à preview
.
Que pensez-vous des vérifications de paramètres nullables et des autres propositions d’aperçu C# ? Partagez votre opinion dans les commentaires ci-dessous.
A propos de l’auteur
David Ramel est éditeur et rédacteur pour Converge360.
.