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

Outros recursos

Interoperabilidade Entre Linguagens