O que é o atributo 'CLSCompliant' no .NET?

Respostas:

181

Você marca as classes com o CLSCompliantatributo quando deseja garantir que ele possa ser usado por qualquer outra linguagem .NET.
Estas são as regras básicas:

  1. Tipos não assinados não devem fazer parte da interface pública da classe. O que isto significa é campos públicos não deve ter tipos não assinados, como uintou ulong, métodos públicos não deve retornar tipos não assinados, parâmetros passados para a função pública não deve ter tipos não assinados. No entanto, os tipos não assinados podem fazer parte de membros particulares.

  2. Tipos não seguros, como ponteiros , não devem ser usados ​​com publicmembros. No entanto, eles podem ser usados ​​com privatemembros.

  3. Os nomes das classes e dos membros não devem diferir apenas com base em maiúsculas e minúsculas. Por exemplo, não podemos ter dois métodos nomeados MyMethode MYMETHOD.

  4. Somente propriedades e métodos podem ser sobrecarregados, os operadores não devem ser sobrecarregados.

Otávio Décio
fonte
Você faria isso como um padrão para cada projeto?
Naeem Sarfraz
3
Não necessariamente, principalmente para aqueles que podem ter exposição a outros idiomas .net.
Otávio Décio
1
Outra limitação é CS3006: método sobrecarregado 'Foo.Bar (ref Baz)' diferindo apenas na ref ou para fora, ou no posto de matriz, não é compatível com CLS
Desenhou Noakes
Mais um: identificadores públicos não devem começar com um caractere sublinhado.
Crono
44

Ele informa a outros consumidores do seu código que ele é compatível com CLS e também faz com que o compilador C # verifique se é compatível com CLS para você.

O artigo mencionado contém muito mais detalhes sobre o que implica a conformidade com o CLS.

Jon Skeet
fonte
12
Portanto, se eu adicionar o atributo e criar meu projeto sem reclamações, isso significa que meu projeto é compatível com CLS e está tudo bem?
Svish
@ Skish, sim, esse é o caso. O compilador informará se você violar alguma regra.
de Drew Noakes
41

As outras respostas estão corretas. Deixe-me esclarecer algumas coisas - CLS significa Common Language Specification. É o conjunto mínimo de regras e recursos de idioma necessários que uma linguagem .NET deve implementar e entender. Este conjunto é um subconjunto do sistema de tipos comuns , que define como os tipos são definidos no .NET.

Ser compatível com CLS significa que você pode escrever um código que possa ser consumido por qualquer idioma que possa ser compilado e executado no CLR. Mas a conformidade com o CLS não é necessária, oferecendo flexibilidade nos casos em que a conformidade com o CLS seria difícil ou impossível de executar.

Se você pretende que seu código seja consumido por outros desenvolvedores, sua API (suas classes e métodos públicos) deve ser compatível com CLS. Você deve declarar isso adicionando o CLSCompliantAttribute aos seus assemblies. Se você não está escrevendo para outras pessoas, a conformidade com o CLS não é necessária, embora o FxCop ( Framework Cop) discorde de mim.

Quando seu assembly é marcado com o CLSCompliantAttribute, o compilador (deve!) Verificará o seu código para ver se, quando compilado, violará alguma das regras do CLS (algumas das quais mencionadas pela ocdecio ) e lhe reportará violações para correção.

Peter Mortensen
fonte
A FxCop me trouxe aqui.
Teoman shipahi
Infelizmente, a grande visão do CLR com muitas linguagens de front-end diferentes (como VB.NET - que está morrendo lentamente - e outras já desapareceram, como MC ++, Delphi.NET, Oxygene, J #, JScript.NET e assim por diante) limita os benefícios de concluir o CLSCompliance, uma vez que os outros idiomas restantes que suportam o CLR não têm problemas para oferecer suporte a recursos que não sejam outcompatíveis com o CLS, como parâmetros e parâmetros opcionais - então, acho que a Microsoft precisa revisar os requisitos do CLS e talvez afrouxá-los.
Dai
13

Compatível com CLS é um subconjunto do espectro completo de idiomas permitido pelo CLR. Ele o restringe a subconjuntos que provavelmente estão disponíveis pela maioria dos idiomas direcionados ao CLR. Isso aumenta, mas não garante, que sua biblioteca possa ser usada por todos os idiomas direcionados ao CLR.

JaredPar
fonte
8

Como se encaixa aqui: Para marcar um projeto inteiro compatível com CLS, adicione esta linha a AssemblyInfo.cs(pode ser encontrada em Propriedades no Solution Explorer)

[assembly:CLSCompliant(true)]

ou equivalente no VB.NET ( AssemblyInfo.vbestá oculto em Meu projeto)

<Assembly: CLSCompliant(True)>

Obrigado por tornar seu código compatível com CLS .

Markus Hartmair
fonte