Pergunta

Que outras restrições existem em nomes (ao lado da singularidade óbvio dentro de um escopo)?

Onde estão aqueles definidos?

Foi útil?

Solução

A partir da PDF da ECMA-335 , Partition II , seção 22, "Metadados preserva seqüências de nome, como criado por um gerador de compilador ou código, inalterado. essencialmente, trata cada corda como um blob opaco. Em particular, ele preserva caso. O CLI não impõe nenhum limite no comprimento de nomes armazenados em metadados e posteriormente processados ??pelo CLI".

Se eu li isso corretamente eo contexto é correta, então não há limite real para o comprimento de um identificador no CLR.

Outras dicas

Além das outras respostas, o comprimento máximo de um identificador que é aceito pelo Visual C # compilador Microsoft é 511 caracteres . Isso pode ser testado com o seguinte código:

class Program
{
    private static void Main(string[] args)
    {
        int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 5;
    }
}

O comprimento do nome da variável não é 511 caracteres. Este código compila, mas se um personagem é adicionado ao nome, o compilador saídas error CS0645: Identifier too long.

Os C # especificação de linguagem Define os identificadores na seção 2.4.2 do Unified C # 3.0 spec. Basicamente, é "letra ou sublinhado" seguido por qualquer número de "letra, dígito decimal, conectando caráter, que combina carácter, formatação de caracteres". Para usar uma palavra-chave como um identificador que você precisa colocar @ na frente, por exemplo, int @int = 5;

Eu não olhei para a especificação CLI, mas eu sei que é um pouco menos restritiva do que a C # especificação, porque o compilador C # usa nomes "indescritíveis" para coisas como métodos anônimos - estes normalmente incluem colchetes, que estão em válido o CLI, mas não é válido em C #.

EDIT: Não há restrições nome comprimento explícito no C # spec, mas seção 2.4.2 tem uma reserva:

identificadores contendo dois caracteres sublinhados consecutivos (L + 005F) está reservada para utilização pela aplicação. Por exemplo, uma aplicação pode fornecer palavras-chave estendidos que começam com dois sublinhados.

Em outras palavras, aplicação específica-lo do quanto a saber se um começo identificador especial com __ vai funcionar. (Alguns compiladores podem ter __foo como uma palavra-chave estendida, e alguns não podem.)

De acordo com vários lugares em "Expert .NET 2.0 IL Assembler" (Serge Lidin, Appress), o CIL funcional / limite CLR é 1.023 bytes como codificados em UTF-8. Cotações:

Página 122:

O comprimento de qualquer tipo de nome em ILAsm não se limita sintaticamente, mas regras de metadados impor certas limitações no comprimento do nome.

Página 126:

O Common Language Runtime impõe uma limitação do comprimento nome completo da classe, especificando que não deve exceder 1.023 bytes em UTF-8. O compilador ILAsm, no entanto, não impõe essa limitação. aspas simples, eles devem ser usados ??para nomes simples em ILAsm, são uma ferramenta puramente lexical e não torná-lo aos metadados; Assim, eles não contribuem para o comprimento total do nome completo da classe.

Página 143:

[TypeDef Tabela] O comprimento combinado das cordas referenciados pelas entradas de nome e Namespace não deve exceder 1.023 bytes.

Página 144:

[Tabela TypeRef] [tempo de execução] O comprimento combinado das cordas referenciados pelas entradas de nome e Namespace não deve exceder 1.023 bytes.

Página 186:

[Método Tabela] Nome (offset na corrente #Strings). O nome de método (não incluindo o nome da classe à qual pertence o método). Este índice entrada mosto uma cadeia diferente de zero de comprimento não superior a 1.023 bytes de codificação UTF-8.

Olhando na partição docs II metadados, afirma que um identificador é ou um ID ou um SQSTRING

Uma ID é descrito como

Uma cadeia contígua de caracteres que começa com qualquer um alfabético personagem ou um dos “_”, “$”, “@” ou “?” e é seguida por um número qualquer de caracteres alfanuméricos ou qualquer um “_”, “$”, “@” Ou “?”

o que implicaria que não há limite de comprimento.

Visual Studio 2015 (atualização 3) - C # 6

Máximo comprimento class name = 993 caracteres

    public class AaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAZZZ
{            
}

Se você gostaria de acrescentar mais 1 personagem para ele, ele doest não compilar e, surpreendentemente, a lista de erros é esvaziar também!

Edit: Para o meu colega com VS2013 Update 3 o limite class name = 1012 . Não sei o motivo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top