¿Qué es el atributo 'CLSCompliant' en .NET?

Respuestas:

181

Marca las clases con el CLSCompliantatributo cuando desea asegurarse de que pueda ser utilizado por cualquier otro lenguaje .NET.
Estas son las reglas básicas:

  1. Los tipos sin firmar no deben formar parte de la interfaz pública de la clase. Lo que esto significa es que los campos públicos no deben tener tipos sin signo como uinto ulong, los métodos públicos no deben devolver tipos sin signo, los parámetros pasados ​​a la función pública no deben tener tipos sin signo. Sin embargo, los tipos sin firmar pueden ser parte de miembros privados.

  2. Los tipos inseguros, como los punteros , no deben usarse con publicmiembros. Sin embargo, se pueden usar con privatemiembros.

  3. Los nombres de las clases y los nombres de los miembros no deben diferir solo según su caso. Por ejemplo, no podemos tener dos métodos nombrados MyMethody MYMETHOD.

  4. Solo las propiedades y los métodos pueden sobrecargarse, los operadores no deben sobrecargarse.

Otávio Décio
fuente
¿Harías eso por defecto para cada proyecto?
Naeem Sarfraz
3
No necesariamente, principalmente para aquellos que pueden estar expuestos a otros lenguajes .net.
Otávio Décio
1
Otra restricción es CS3006: el método sobrecargado 'Foo.Bar (ref Baz)' que difiere solo en ref o out, o en rango de matriz, no es compatible con CLS
Drew Noakes
Una más: los identificadores públicos no deben comenzar con un carácter de subrayado.
Crono
44

Le informa a otros consumidores de su código que es compatible con CLS y también hace que el compilador de C # verifique que sea compatible con CLS para usted.

El artículo referenciado contiene muchos más detalles sobre lo que implica el cumplimiento de CLS.

Jon Skeet
fuente
12
Entonces, si agrego el atributo y luego construyo mi proyecto sin quejas, ¿eso significa que mi proyecto cumple con CLS y todo está bien?
Svish
@Svish, sí, ese es el caso. El compilador le informará si viola alguna regla.
Drew Noakes
41

Las otras respuestas son correctas. Permítanme aclarar algunas cosas: CLS significa Common Language Specification. Es el conjunto mínimo de reglas y características de lenguaje requeridas que un lenguaje .NET debe implementar y comprender. Este conjunto es un subconjunto del sistema de tipos común , que define cómo se definen los tipos en .NET.

Cumplir con CLS significa que puede escribir código que puede ser consumido por cualquier lenguaje que pueda compilarse y ejecutarse en el CLR. Pero el cumplimiento de CLS no es obligatorio, lo que le brinda flexibilidad en los casos en que el cumplimiento de CLS sería difícil o imposible de hacer.

Si desea que otros desarrolladores consuman su código, su API (sus clases y métodos públicos) debe cumplir con CLS. Debería declarar esto agregando CLSCompliantAttribute a sus ensamblajes. Si no está escribiendo para otros, el cumplimiento de CLS no es necesario, aunque FxCop ( Framework Cop) no estaría de acuerdo conmigo.

Cuando su ensamblaje está marcado con el atributo CLSCompliantAttribute, el compilador (¡debería!) Comprobará su código para ver si, cuando se compila, violará alguna de las reglas de CLS (algunas de las cuales se mencionaron en ocdecio ) y le informará las infracciones para su reparación.

Peter Mortensen
fuente
FxCop me trajo aquí.
Teoman shipahi
Desafortunadamente, la gran visión del CLR que tiene muchos lenguajes frontend diferentes (como VB.NET, que muere lentamente) y otros ahora desaparecidos, como MC ++, Delphi.NET, Oxygene, J #, JScript.NET, etc., limita Los beneficios de completar CLSCompliance dado que los otros lenguajes restantes que admiten CLR no tienen problemas para admitir características que no cumplen con CLS, como parámetros y outparámetros opcionales , por lo que creo que Microsoft necesita revisar los requisitos de CLS y quizás aflojarlos.
Dai
13

CLS compatible es un subconjunto del espectro de lenguaje completo permitido por el CLR. Lo restringe a subconjuntos que probablemente estén disponibles en la mayoría de los idiomas que se dirigen al CLR. Esto aumenta, pero no garantiza, que su biblioteca pueda ser utilizada por todos los idiomas dirigidos al CLR.

JaredPar
fuente
8

Como encaja aquí: para marcar un proyecto completo compatible con CLS, agregue esta línea a AssemblyInfo.cs(se puede encontrar en Propiedades en el Explorador de soluciones)

[assembly:CLSCompliant(true)]

o equivalente en VB.NET ( AssemblyInfo.vbestá oculto en Mi proyecto)

<Assembly: CLSCompliant(True)>

Gracias a hacer que su código sea compatible con CLS .

Markus Hartmair
fuente