CLS (Common Language Specification)
Para interagir totalmente com outros objetos independentemente da linguagem em que foram implementados, os objetos devem expor aos chamadores somente os recursos que são comuns a todas as linguagens com as quais eles devem interoperar.Por este motivo, o CLS (Common Language Specification), que é um conjunto de recursos básicos de linguagens necessários para muitos aplicativos, foi definido.As regras CLS definem um subconjunto do Common Type System; ou seja, todas as regras que se aplicam ao CTS se aplicam ao CLS, exceto onde regras mais rígidas são definidas no CLS.O CLS ajuda a aperfeiçoar e a garantir a interoperabilidade de linguagem definindo um conjunto de recursos nos quais os desenvolvedores podem confiar por estarem disponíveis em uma variedade de linguagens.O CLS também estabelece requisitos para a compatibilidade com CLS; estes ajudam você a determinar se seu código gerenciado está de acordo com o CLS e em que medida uma determinada ferramenta suporta o desenvolvimento de código gerenciado que usa recursos CLS.
Se o componente usa apenas recursos CLS na API que ele expõe para outros códigos (incluindo classes derivadas), é garantido que o componente será acessível a partir de qualquer linguagem de programação que suporte o CLS.Componentes que aderem às regras CLS e usam somente os recursos incluídos no CLS são considerados componentes compatíveis com CLS.
A maioria dos membros definidos pelos tipos na Visão geral sobre biblioteca classes do .NET Framework é compatível com CLS.No entanto, alguns tipos da biblioteca de classes têm um ou mais membros que não são compatíveis com CLS.Estes membros ativam o suporte para recursos de linguagens que não estão no CLS.Os tipos e membros que não são compatíveis com CLS são identificados como tal na documentação de referência, e em todos os casos uma alternativa compatível com CLS está disponível.Para obter mais informações sobre os tipos na biblioteca de classes do .NET Framework, consulte Referência à Biblioteca Classe do .NET Framework.
O CLS foi projetado para ser grande o suficiente para incluir as construções de linguagem que normalmente são necessárias pelos desenvolvedores, mas pequeno o suficiente de forma que a maioria das linguagens possam oferecer suporte a ele.Além disso, qualquer construção de linguagem que torna impossível verificar rapidamente a segurança de tipos do código foi excluída do CLS para que todas as linguagens compatíveis com CLS possam produzir código verificável se elas optarem por fazer isso.Para obter mais informações sobre a verificação de segurança de tipos, consulte Compilação MSIL para código nativo.
A tabela a seguir resume os recursos que estão no CLS e indica se o recurso se aplica tanto aos desenvolvedores e compiladores (Todos) ou somente compiladores.Ela tem como objetivo ser informativa, mas não abrangente.Para obter detalhes, consulte a especificação para o Common linguagem Infrastructure, partição I, que está disponível no Microsoft Developer rede (MSDN) Site da Web.
Recurso |
Se aplica a |
Descrição |
---|---|---|
Geral |
|
|
Visibilidade |
Todos |
Regras CLS se aplicam apenas às partes de um tipo que são expostas fora do assembly que o define. |
Membros globais |
Todos |
Campos e métodos static globais não são compatíveis com CLS. |
Nomenclatura |
|
|
Caracteres e uso de maiúsculas e minúsculas |
Todos |
Os compiladores das linguagens compatíveis com CLS devem seguir as regras da Annex 7 do Technical Report 15 do Unicode Standard 3.0, que controla o conjunto de caracteres que podem iniciar e serem incluídos nos identificadores.Este padrão está disponível no site do Unicode Consortium. Para dois identificadores serem considerados distintos, eles não devem ser iguais ao se ignorar se as são letras maiúsculas ou minúsculas. |
Palavras-chave |
Compiladores |
Compiladores de linguagens compatíveis com CLS fornecem um mecanismo para a referência de identificadores que coincidem com palavras-chave.Compiladores de linguagens compatíveis com CLS fornecem um mecanismo para definir e substituir métodos virtuais com nomes que são palavras-chave na mesma linguagem. |
Unicidade |
Todos |
Todos os nomes em um escopo compatível com CLS devem ser distintos, mesmo que os nomes sejam para dois tipos diferentes de membros, exceto onde os nomes são idênticos e resolvidos através sobrecarga.Por exemplo, o CLS não permite a um único tipo usar o mesmo nome para um método e um campo. |
Assinaturas |
Todos |
Todos os tipos de retorno e de parâmetro de um tipo ou em uma assinatura de um membro devem ser compatíveis com CLS. |
Tipos |
|
|
Tipos primitivos |
Todos |
A Biblioteca de classes do .NET Framework inclui os tipos que correspondem aos tipos de dados primitivos que os compiladores usam.Um desses tipos é compatíveis compatível compatível com CLS o seguinte: Byte, Int16, Int32, Int64, Single, Double, Boolean, Char, Decimal, IntPtr, e String. Para obter mais informações sobre esses tipos, consulte a tabela de tipos em Visão geral sobre biblioteca classes do .NET Framework. |
Tipos convertidos |
Todos |
Tipos de valor convertido (tipos cujos valores foram convertidos em objetos) não fazem parte do CLS.Em vez disso, use System.Object, System.ValueType, ou System.Enum, conforme apropriado. |
Visibilidade |
Todos |
Declarações de tipos e de membros não devem conter tipos que são menos visíveis ou acessíveis do que o tipo ou membro sendo declarado. |
Métodos de interface |
Compiladores |
Compiladores de linguagens compatíveis com CLS devem ter sintaxe para a situação onde um único tipo implementa duas interfaces e cada uma dessas interfaces requer a definição de um método com o mesmo nome e assinatura.Esses métodos devem ser considerados distintos e não precisam ter a mesma implementação. |
Fechamento |
Todos |
Os membros individuais das interfaces e das classes abstratas compatíveis com CLS devem ser definidos para serem compatíveis com CLS. |
Chamada de construtor |
Todos |
Antes que ele acesse algum dado instanciado que foi herdado, um construtor deve chamar o construtor da classe base. |
Referências tipadas |
Todos |
Referências tipadas não são compatíveis com CLS.(Uma referência tipada é uma construção especial que contém uma referência a um objeto e uma referência a um tipo.Referências tipadas ativam o Common Language Runtime para fornecer suporte em estilo C++ para os métodos que possuem um número variável de argumentos.) |
Membros de Tipos |
|
|
Sobrecarga |
Todos |
Propriedades indexadas, métodos, e construtores podem ser sobrecarregados; campos e eventos não devem ser sobrecarregados. Propriedades não devem ser sobrecarregadas por tipo (ou seja, pelo tipo de retorno do seu método getter) mas elas podem ser sobrecarregadas com diferentes números ou tipos de índices. Métodos podem ser sobrecarregados somente com base no número e tipos de seus parâmetros, e no caso de métodos genéricos, no número de seus parâmetros genéricos. A sobrecarga de operador não está no CLS.No entanto, o CLS fornece diretrizes sobre como fornecer nomes úteis (como Add()) e sobre como configurar um bit em metadados.Compiladores que escolhem oferecer suporte a sobrecarga de operador devem seguir estas diretrizes mas não precisam fazer isso. |
Unicidade de membros sobrecarregados |
Todos |
Campos e tipos aninhados devem ser distintos unicamente por comparação de identificadores.Métodos, propriedades e eventos que têm o mesmo nome (por comparação de identificadores) devem diferir por mais do que apenas o tipo de retorno. |
Operadores de conversão |
Todos |
Se op_Implicit ou op_Explicit está sobrecarregado no seu tipo de retorno, um meio alternativo de fornecer a conversão deve ser fornecido. |
Métodos |
|
|
Acessibilidade aos métodos substituídos |
Todos |
A acessibilidade não deve ser alterada quando métodos herdados forem substituídos, exceto quando substituir um método herdado de um assembly diferente com acessibilidade FamilyOrAssembly.Neste caso, a substituição deve ter acessibilidade Family. |
Listas de argumentos |
Todos |
A única convenção de chamada suportada pelo CLS é a convenção padrão de chamada gerenciada; listas de argumentos com comprimento variável não são permitidas.(Use a palavra-chave ParamArray no Microsoft Visual Basic e a palavra-chave params em C# para suporte a um número variável de argumentos.) |
Propriedades |
|
|
Metadados de acessador |
Compiladores |
Os métodos getter e setter que implementam os métodos de uma propriedade são marcados com o identificador mdSpecialName nos metadados. |
Modificadores |
Todos |
A propriedade e seus acessadores devem ser todos static, todos virtual ou todos instance. |
Nomes de acessadores |
Todos |
Propriedades devem seguir padrões de nomeação específicos.Para uma propriedade chamada Name, o método getter, se definido, será chamado de get_Name e o método setter, se definido, ser será chamado de set_Name. |
Tipo de retorno e argumentos |
Todos |
O tipo da propriedade é o tipo de retorno do getter e o tipo do último argumento do setter.Os tipos dos parâmetros da propriedade são os tipos dos parâmetros do getter e os tipos de todos os parâmetros, com a exceção do último, do setter.Todos estes tipos devem ser compatíveis com CLS e não podem ser ponteiros gerenciados; eles não devem ser passados por referência. |
Eventos |
|
|
Métodos de eventos |
Todos |
Os métodos para adicionar e remover um evento devem ambos estar presentes ou ausentes. |
Metadados de métodos de eventos |
Compiladores |
Os métodos que implementam um evento devem ser marcados com o identificador mdSpecialName nos metadados. |
Acessibilidade do acessador |
Todos |
A acessibilidade dos métodos para adicionar, remover e disparar um evento deve ser idêntica. |
Modificadores |
Todos |
Os métodos para adicionar, remover, e disparar um evento devem ser todos static, todos virtual ou todos instance. |
Nomes de métodos de eventos |
Todos |
Eventos devem seguir padrões específicos de nomeação.Para um evento nomeado MyEvent, o método de adição, se definido, será nomeado add_MyEvent, o método remover, se definido, será nomeado remove_MyEvent, e o método para disparar um evento irá ser nomeado raise_MyEvent. |
Argumentos |
Todos |
Os métodos para adicionar e remover um evento devem tomar cada um um parâmetro cujo tipo define o tipo de evento, e esse tipo precisa ser derivado de System.Delegate. |
Tipos ponteiro |
|
|
Ponteiros |
Todos |
Tipos ponteiro e tipos ponteiro de função não são compatíveis com CLS. |
Interfaces |
|
|
Assinaturas de membros |
Todos |
Interfaces compatíveis com CLS não devem exigir a definição de métodos incompatíveis com CLS para implementá-los. |
Modificadores de membros |
Todos |
Interfaces compatíveis com CLS não podem definir métodos estáticos, nem podem definir campos.Elas podem definir propriedades, eventos e métodos virtuais. |
Tipos de referência |
|
|
Chamada de construtor |
Todos |
Para tipos de referência, objetos construtores são chamados somente como parte da criação de um objeto, e objetos são inicializados somente uma vez. |
Tipos de classes |
|
|
Herança |
Todos |
Uma classe compatível com CLS deve herdar de uma classe compatível com CLS. (System.Object é compatível com CLS). |
Arrays1 |
|
|
Tipos de elementos |
Todos |
Elementos de matrizes devem ser tipos compatíveis com CLS. |
Dimensões |
Todos |
Matrizes devem ter um número fixo de dimensões, maior do que zero. |
Limites |
Todos |
Todas as dimensões da matriz devem ter um limite inferior zero. |
Enumerações |
|
|
Tipo base |
Todos |
O tipo subjacente de uma enumeração deve ser um tipo interno inteiro CLS (Byte, Int16, Int32, ou Int64). |
FlagsAttribute |
Compiladores |
A presença do atributo personalizado System.FlagsAttribute na definição de uma enumeração indica que a enumeração deve ser tratada como um conjunto de campos de bit (sinalizadores), e a ausência deste atributo indica que o tipo deve ser visto como um grupo de constantes enumeradas.É recomendável que as linguagens usem um FlagsAttribute ou sintaxe específica da linguagem para distinguir entre estes dois tipos de enumerações. |
Membros de campos |
Todos |
Campos literais de uma enumeração static devem ser do mesmo tipo do tipo da própria enumeração. |
Exceções |
|
|
Herança |
Todos |
Objetos que são lançados devem ser do tipo System.Exception ou herdar de System.Exception. |
Atributos personalizados |
|
|
Codificações de valores |
Compiladores |
Compiladores compatíveis com CLS são necessários para lidar com apenas um subconjunto das codificações de atributos personalizados (a representação de atributos personalizados em metadados).Os únicos tipos que têm permissão para aparecer nestas codificações são: System.Type, System.String, System.Char, System.Boolean, System.Byte, System.Int16, System.Int32, System.Int64, System.Single, System.Double, e qualquer tipo enumeração baseado em um tipo inteiro base compatível com CLS. |
Metadados |
|
|
Compatibilidade com CLS |
Todos |
Tipos cuja compatibilidade CLS difere da do assembly em que eles são definidos devem ser assim marcados com System.CLSCompliantAttribute.Da mesma forma, os membros cuja compatibilidade CLS difere da do seu tipo também devem ser marcados.Se um membro ou um tipo estiver marcado como não compatível com CLS, uma alternativa compatível com CLS deve ser fornecida. |
Genéricos |
||
Nomes de tipos |
Compiladores |
O nome de um tipo genérico deve codificar o número de parâmetros declarados no tipo.O nome de um tipo genérico aninhado deve codificar o número de parâmetros recém-introduzidos no tipo. |
Tipos aninhados |
Compiladores |
Tipos aninhados devem ter pelo menos o mesmo número de parâmetros genéricos do que o tipo delimitador.Parâmetros genéricos em um tipo aninhado correspondem aos parâmetros genéricos no seu tipo delimitador pela posição. |
Restrições |
Todos |
Um tipo genérico deve declarar restrições suficientes para garantir que quaisquer restrições sobre o tipo base ou sobre as interfaces sejam atendidas pelas restrições do tipo genérico. |
Tipos de restrição |
Todos |
Tipos usados como restrições sobre parâmetros genéricos devem eles próprios ser compatíveis com CLS. |
Assinaturas de membros |
Todos |
A visibilidade e a acessibilidade de membros (incluindo tipos aninhados) em um tipo genérico instanciado são considerados como sendo escopos para a instanciação específica em vez da declaração de um tipo genérico como um todo. |
Métodos genéricos |
Todos |
Para cada método genérico abstrato ou virtual, é preciso que haja uma implementação concreta (não abstrata) padrão. |
1.Matrizes denteadas — ou seja, matrizes de matrizes — são compatíveis com CLS.No .NET Framework versão 1.0, o compilador C# por engano relata que elas não são.
Consulte também
Conceitos
Visão geral da interoperabilidade de linguagem