Dans les articles précédents de cette série, nous avons découvert que, dans certains scénarios, les constructeurs des types valeur (structs) peuvent ne pas être exécutés, malgré une syntaxe qui pourrait laisser penser le contraire.
Être conscient de ce comportement est essentiel, et une attention particulière doit être portée lors de la définition d'API publiques (surtout dans les bibliothèques en raison de leur portée potentielle) afin d'éviter de créer des API contre-intuitives et/ou sujettes aux erreurs, car les développeurs pourraient facilement tomber dans le piège de l'utilisation de membres non initialisés1.
Cela dit, ce comportement n'est pas nouveau ; les problèmes évoqués dans les articles #5, #6 et #7 existent depuis les premières versions du langage. Cependant, l'introduction, en C# 10, de la possibilité de définir des constructeurs sans paramètre dans les structs ajoute une couche de complexité supplémentaire et augmente les chances que les développeurs soient exposés à de tels types2.
Ainsi, si vous consommez des types struct, soyez vigilant afin de ne pas utiliser d'instances non initialisées1. D'un autre côté, faites particulièrement attention lorsque vous définissez de nouveaux types struct, en particulier si vous ajoutez des constructeurs sans paramètres ou un constructeur dont tous les paramètres sont optionnels.
Donc nous arrivons au dernier article de cette série. J'espère que vous avez apprécié ce parcours, que vous y avez appris quelque chose de nouveau et que vous vous sentez désormais mieux préparé(e) à utiliser/définir vos propres structs.
Comme toujours, tout retour est bienvenu.
Amusez-vous bien et à bientôt !
-
Note de clarification : Du point de vue du runtime, les
structssont garantis d’être initialisés (par une mise à zéro complète de la structure) avant d’être utilisés. Le terme initialisation dans cette série d’articles signifie que tous les champs/propriétés dustructont reçu des valeurs significatives, laissant ainsi l’instance dans un état cohérent.↩↩ -
Avant C# 10, la seule façon pour un développeur d'être exposé à de tels types était de consommer des assemblages compilés avec un langage prenant en charge cette fonctionnalité, comme IL ; personnellement, je n’ai jamais rencontré un seul exemple de ce genre.↩
No comments:
Post a Comment