Qual é o comprimento máximo de um identificador C # / CLI?
-
06-07-2019 - |
Pergunta
Que outras restrições existem em nomes (ao lado da singularidade óbvio dentro de um escopo)?
Onde estão aqueles definidos?
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.