Qu'est-ce que l'attribut «CLSCompliant» dans .NET?

Réponses:

181

Vous marquez les classes avec l' CLSCompliantattribut lorsque vous souhaitez vous assurer qu'il peut être utilisé par n'importe quel autre langage .NET.
Voici les règles de base:

  1. Les types non signés ne doivent pas faire partie de l'interface publique de la classe. Cela signifie que les champs publics ne doivent pas avoir de types non signés comme uintou ulong, les méthodes publiques ne doivent pas renvoyer de types non signés, les paramètres passés à la fonction publique ne doivent pas avoir de types non signés. Cependant, les types non signés peuvent faire partie de membres privés.

  2. Les types non sécurisés tels que les pointeurs ne doivent pas être utilisés avec les publicmembres. Cependant, ils peuvent être utilisés avec les privatemembres.

  3. Les noms de classe et les noms de membres ne doivent pas différer uniquement en fonction de leur cas. Par exemple, nous ne pouvons pas avoir deux méthodes nommées MyMethodet MYMETHOD.

  4. Seules les propriétés et les méthodes peuvent être surchargées, les opérateurs ne doivent pas être surchargés.

Otávio Décio
la source
Feriez-vous cela par défaut pour chaque projet?
Naeem Sarfraz
3
Pas nécessairement, surtout pour ceux qui peuvent être exposés à d'autres langages .net.
Otávio Décio
1
Une autre restriction est CS3006: la méthode surchargée 'Foo.Bar (ref Baz)' ne différant que par ref ou out, ou par rang de tableau, n'est pas conforme à CLS
Drew Noakes
Encore un: les identificateurs publics ne doivent pas commencer par un caractère de soulignement.
Crono
44

Il indique aux autres consommateurs de votre code qu'il est conforme CLS et permet également au compilateur C # de vérifier qu'il est conforme CLS pour vous.

L'article référencé contient beaucoup plus de détails sur ce qu'implique la conformité CLS.

Jon Skeet
la source
12
Donc, si j'ajoute l'attribut et que je construis mon projet sans me plaindre, cela signifie que mon projet est conforme CLS et que tout va bien?
Svish
@Svish, oui c'est le cas. Le compilateur vous fera savoir si vous enfreignez des règles.
Drew Noakes
41

Les autres réponses sont correctes. Permettez-moi de clarifier certaines choses - CLS signifie la spécification de langage commun. C'est l'ensemble minimal de règles et de fonctionnalités linguistiques requises qu'un langage .NET doit implémenter et comprendre. Cet ensemble est un sous-ensemble du système de types commun , qui définit la manière dont les types sont définis dans .NET.

Être conforme CLS signifie que vous pouvez écrire du code qui peut être utilisé par n'importe quel langage qui peut être compilé et exécuté sur le CLR. Mais la conformité CLS n'est pas requise, ce qui vous donne la flexibilité dans les cas où la conformité CLS serait difficile ou impossible à faire.

Si vous prévoyez que votre code soit utilisé par d'autres développeurs, votre API (vos classes et méthodes publiques) doit être conforme CLS. Vous devez déclarer cela en ajoutant le CLSCompliantAttribute à vos assemblys. Si vous n'écrivez pas pour d'autres, la conformité CLS n'est pas nécessaire, bien que FxCop ( Framework Cop) ne soit pas d'accord avec moi.

Lorsque votre assembly est marqué avec le CLSCompliantAttribute, le compilateur vérifiera (devrait!) Votre code pour voir si, une fois compilé, il violera l'une des règles CLS (dont certaines ocdecio mentionnées) et vous signalera les violations pour correction.

Peter Mortensen
la source
FxCop m'a amené ici.
Teoman shipahi
Malheureusement, la grande vision du CLR ayant de nombreux langages frontaux différents (comme VB.NET - qui meurt lentement - et d'autres maintenant disparus, comme MC ++, Delphi.NET, Oxygene, J #, JScript.NET, etc.) limite les avantages de compléter le CLSCompliance étant donné que les autres langues qui prennent en charge le CLR n'ont aucun problème à prendre en charge les fonctionnalités non conformes au CLSC, telles que les paramètres et les outparamètres facultatifs - donc je pense que Microsoft doit revoir les exigences du CLS et peut-être les assouplir.
Dai
13

La conformité CLS est un sous-ensemble du spectre linguistique complet autorisé par le CLR. Il le limite aux sous-ensembles qui sont probablement disponibles par la majorité des langues qui ciblent le CLR. Cela augmente, mais ne garantit pas, que votre bibliothèque peut être utilisée par toutes les langues ciblant le CLR.

JaredPar
la source
8

Comme il convient ici: pour marquer un projet entier conforme CLS, ajoutez cette ligne à AssemblyInfo.cs(se trouve sous Propriétés dans l'Explorateur de solutions)

[assembly:CLSCompliant(true)]

ou de manière équivalente dans VB.NET ( AssemblyInfo.vbest caché sous Mon projet)

<Assembly: CLSCompliant(True)>

Merci de rendre votre code conforme CLS .

Markus Hartmair
la source