Quelle est la longueur maximale d'un identifiant C#/CLI?
Quelles autres restrictions y a-t-il sur les noms (à côté de l'unicité évidente dans une portée)?
Où sont-ils définis?
6 réponses
Du PDF D'ECMA-335, Partition II, section 22, " les métadonnées préservent les chaînes de noms, telles qu'elles sont créées par un compilateur ou un générateur de code, inchangées. Essentiellement, il traite chaque chaîne comme un blob opaque. En particulier, il préserve le cas. La CLI n'impose aucune limite à la longueur des noms stockés dans les métadonnées et ensuite traités par la CLI".
Si j'ai lu ceci correctement et que le contexte est correct, il n'y a pas de limite réelle à la longueur d'un identifiant dans le CLR.
En plus des autres réponses, la longueur maximale de l'identifiant acceptée par le compilateur Microsoft Visual C# est 511 caractères . Cela peut être testé avec le code suivant:
class Program
{
private static void Main(string[] args)
{
int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 5;
}
}
La longueur du nom de la variable est de 511 caractères. Ce code compile, mais si un caractère est ajouté au nom, le compilateur sorties error CS0645: Identifier too long
.
La spécification du langage C# définit les identifiants dans la section 2.4.2 de la spécification unifiée C# 3.0. Fondamentalement, c'est" lettre ou trait de soulignement "suivi d'un nombre quelconque de"lettre, chiffre décimal, caractère de connexion, caractère de combinaison, caractère de formatage". Pour utiliser un mot-clé comme identifiant, vous devez mettre @ en avant, par exemple int @int = 5;
Je n'ai pas regardé dans la spécification CLI, mais je sais que c'est un peu moins restrictif que la spécification C#, car le compilateur C # utilise des noms "indicibles" pour les choses comme les méthodes anonymes-celles-ci incluent généralement des équerres, qui sont valides dans la CLI mais non valides en C#.
EDIT: il N'y a pas de restrictions de longueur de nom explicites dans la spécification C#, mais la section 2.4.2 a une réserve:
Les identifiants contenant deux caractères de soulignement consécutifs (U + 005F) sont réservés à l'utilisation par l'implémentation. Par exemple, une implémentation peut fournir des mots clés étendus qui commencent par deux traits de soulignement.
Dans les autres mots, il est spécifique à l'implémentation quant à savoir si un identifiant particulier commençant par __
fonctionnera. (Certains compilateurs peuvent avoir __foo
comme mot-clé étendu, et d'autres non.)
Selon différents endroits dans "expert. net 2.0 Il Assembler" (Serge Lidin, Apress), la limite fonctionnelle CIL/CLR est de 1 023 octets codés en UTF-8. Citations:
Page 122:
La longueur de l'un ou l'autre type de nom dans ILAsm n'est pas limitée syntaxiquement, mais les règles de métadonnées imposent certaines limites à la longueur du nom.
Page 126:
Le runtime common language impose une limitation sur la longueur complète du nom de classe, en spécifiant qu'il doit ne pas dépasser 1 023 octets en encodage UTF-8. Le compilateur ILAsm, cependant, n'applique pas cette limitation. Les guillemets simples, s'ils sont utilisés pour des noms simples dans ILAsm, sont un outil purement lexical et ne correspondent pas aux métadonnées; ainsi, ils ne contribuent pas à la longueur totale du nom de classe complet.
Page 143:
[table TypeDef] la longueur combinée des chaînes référencées par les entrées Name et Namespace ne doit pas dépasser 1 023 octets.
Page 144:
[table TypeRef] [durée d'exécution] la longueur combinée des chaînes référencées par les entrées Name et Namespace ne doit pas dépasser 1 023 octets.
Page 186:
[table de méthode] Nom (décalage dans le flux #Strings). Le nom de la méthode (sans compter le nom de la classe à laquelle appartient la méthode). Cette entrée doit indexer une chaîne de longueur non nulle ne dépassant pas 1 023 octets en encodage UTF-8.
En regardant dans les documents de métadonnées de la Partition II, il indique qu'un identifiant est un ID ou un SQSTRING
Un ID est décrit comme
Une chaîne de caractères contiguë qui commence par soit un alphabétique caractère ou à l'un des "_ ", "$", "@" ou "?"et est suivi par un certain nombre de caractères alphanumériques ou l'un des "_ ", "$", "@", ou "?"
Ce qui impliquerait qu'il n'y a pas de limite de longueur.
Visual Studio 2015 (mise à jour 3) - C# 6
Longueur maximale du nom de classe= 993 caractères
public class AaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAZZZ
{
}
Si vous ajoutez 1 caractère de plus, il ne compile pas et étonnamment la liste d'erreurs est également vide!
Edit: pour mon collègue avec VS2013 Update 3 la limite de nom de classe= 1012. Ne sais pas pourquoi.