Cos'è l'attributo 'CLSCompliant' in .NET?


Risposte:


181

Contrassegnare le classi con l' CLSCompliantattributo quando si desidera assicurarsi che possa essere utilizzato da qualsiasi altro linguaggio .NET.
Queste sono le regole di base:

  1. I tipi senza segno non devono far parte dell'interfaccia pubblica della classe. Ciò significa che i campi pubblici non dovrebbero avere tipi senza segno come uinto ulong, i metodi pubblici non dovrebbero restituire tipi senza segno, i parametri passati alla funzione pubblica non dovrebbero avere tipi senza segno. Tuttavia, i tipi senza segno possono far parte di membri privati.

  2. I tipi non sicuri come i puntatori non devono essere utilizzati con i publicmembri. Tuttavia, possono essere utilizzati con i privatemembri.

  3. I nomi delle classi e dei membri non devono differire solo in base al loro caso. Ad esempio non possiamo avere due metodi denominati MyMethode MYMETHOD.

  4. Solo proprietà e metodi possono essere sovraccaricati, gli operatori non dovrebbero essere sovraccarichi.


Lo faresti come predefinito per ogni progetto?
Naeem Sarfraz,

3
Non necessariamente, principalmente per quelli che potrebbero essere esposti ad altre lingue .net.
Otávio Décio,

1
Un'altra restrizione è CS3006: il metodo di sovraccarico 'Foo.Bar (ref Baz)' che differisce solo in ref o out, o in classifica array, non è conforme a CLS
Drew Noakes

Ancora uno: gli identificatori pubblici non dovrebbero iniziare con un carattere di sottolineatura.
Crono,

44

Indica agli altri utenti del tuo codice che è conforme a CLS e inoltre verifica che il compilatore C # sia conforme a CLS per te.

L'articolo di riferimento contiene molti più dettagli su ciò che comporta la conformità CLS.


12
Quindi, se aggiungo l'attributo e poi costruisco il mio progetto senza lamentele, ciò significa che il mio progetto è conforme a CLS e tutto va bene?
Svish,

@Svish, sì, è così. Il compilatore ti farà sapere se si violano le regole.
Ha disegnato Noakes il

41

Le altre risposte sono corrette. Vorrei chiarire alcune cose: CLS è l'acronimo di Common Language Specification. È l'insieme minimo di regole e funzionalità del linguaggio richiesto che un linguaggio .NET deve implementare e comprendere. Questo set è un sottoinsieme del sistema di tipi comune , che definisce come i tipi sono definiti in .NET.

Essere conformi a CLS significa che è possibile scrivere codice che può essere utilizzato da qualsiasi lingua che può essere compilata ed eseguita sul CLR. Ma la conformità CLS non è richiesta, offrendoti la flessibilità nei casi in cui la conformità CLS sarebbe difficile o impossibile da fare.

Se intendi che il tuo codice venga utilizzato da altri sviluppatori, la tua API (le tue classi e i tuoi metodi pubblici) dovrebbe essere conforme a CLS. Dovresti dichiararlo aggiungendo il CLSCompliantAttribute ai tuoi assembly. Se non stai scrivendo per altri, la conformità CLS non è necessaria, anche se FxCop ( Framework Cop) non sarebbe d'accordo con me.

Quando l'assembly è contrassegnato con CLSCompliantAttribute, il compilatore (dovrebbe!) Controllerà il codice per vedere se, quando compilato, violerà una qualsiasi delle regole CLS (alcune delle quali citate in ocdecio ) e ti segnalerà violazioni per la correzione.


FxCop mi ha portato qui.
Teoman Shipahi,

Sfortunatamente la grande visione del CLR che ha molti linguaggi frontend diversi (come VB.NET - che muore a morte lenta - e altri ormai andati, come MC ++, Delphi.NET, Oxygene, J #, JScript.NET e così via) limita i vantaggi del completamento di CLSCompliance dato che le altre lingue rimanenti che supportano il CLR non hanno problemi a supportare funzionalità non conformi a CLSC come parametri e outparametri opzionali - quindi penso che Microsoft debba rivisitare i requisiti del CLS e forse allentarli.
Dai,

13

CLS compliant è un sottoinsieme dell'intero spettro linguistico consentito dal CLR. Lo limita ai sottoinsiemi che sono probabilmente disponibili dalla maggior parte delle lingue destinate al CLR. Ciò aumenta, ma non garantisce, che la tua libreria possa essere utilizzata da tutte le lingue destinate al CLR.


8

Come si adatta qui: per contrassegnare un intero progetto conforme a CLS, aggiungere questa riga AssemblyInfo.cs(è disponibile in Proprietà in Esplora soluzioni)

[assembly:CLSCompliant(true)]

o equivalentemente in VB.NET ( AssemblyInfo.vbè nascosto in Il mio progetto)

<Assembly: CLSCompliant(True)>

Grazie alla conformità del tuo codice CLS .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.