Comment faire un bon usage des attributs CLSCompliant ?

La bonne pratique voudrait que tout code .net soit CLS Compliant. Aujourd'hui, on peut se demander pourquoi faire la remarque. Mais, je me suis rendu compte que nombre de développeurs ne savent pas ce que cela signifiait.

En une phrase : Un code CLS Compliant peut être appelé par un projet C#, F#, ou VB sans problèmes.

Quand le compilateur dit qu'un code n'est pas CLS Compliant, c'est donc qu'il y a un risque que votre librairie ne soit pas exploitable dans un autre projet. Attention : un autre projet peut utiliser votre code et compiler sans problèmes. Mais à l'exécution il peut y avoir des effets de bord.

Ex: une classe écrite en C# avec deux méthodes ayant le même nom, les mêmes arguments. Mais sur l'une d'elle, l'un des arguments est préfixé d'un "ref". VB ne sera pas en mesure de faire la différence entre ces deux méthodes.

Comme l'explique très bien la documentation, il y a beaucoup d'autres cas. Je présente celui-ci, car comme beaucoup de problèmes de codes non CLS Compliant, il y a là un problème de qualité de code. Cette manière de coder complexifie la lecture du code, et vos collègues, ou utilisateurs de votre librairie ne comprendront peut-être pas bien vos intentions.

Si vous n'utilisez un seul langage, un warning de type "not CLS Compliant" est à prendre comme un problème de qualité à traiter.

Il y aura malheureusement des cas où l'on doit utiliser des librairies, et des classes non CLS Compliant. Je pense par exemple à l'usage de très anciens interops Office.

Dans ces cas, là il y a une approche très simple à suivre :

  • Ne pas utiliser ces types comme arguments de vos méthodes publiques.
  • Créer des classes "passe-plat" qui seront CLS Compliant, et qui porteront les propriétés dont vous avez besoin pour créer en interne l'objet non CLS Compliant.

Si cela n'est pas possible, il faut marquer la classe avec l'attribut suivant (ceci est le dernier recours, on est d'accord?):


[CLSCompliant(false)]

Mais surtout, il ne faut pas utiliser cet attribut au niveau de l'assembly. Si vous l'avez dans votre projet, passez-le temporairement à true pour observer les dégâts, et planifier leur remédiation.


[assembly: CLSCompliant(true)]

Cet attribut mis à false, est là pour cacher la misère. Il finira toujours par propager les problèmes.

Jérémy Jeanson

Comments

You have to be logged in to comment this post.