Question

Quelles autres restrictions y a-t-il sur les noms (en plus de l'unicité évidente dans un champ)?

Où sont définis ceux-ci?

Était-ce utile?

La solution

Extrait du fichier PDF de l'ECMA-335 , partition II , section 22, "Les métadonnées conservent les chaînes de noms, telles que créées par un compilateur ou un générateur de code, sans aucune modification. Essentiellement, il traite chaque chaîne en tant que blob opaque. En particulier, il préserve la casse. La CLI n’impose aucune limite à la longueur des noms stockés dans les métadonnées et traités par la suite par la CLI ".

Si j'ai lu cela correctement et que le contexte est correct, il n'y a pas de limite réelle à la longueur d'un identifiant dans le CLR.

Autres conseils

Outre les autres réponses, la longueur maximale d'identificateur 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 est compilé, mais si un caractère est ajouté au nom, le compilateur génère erreur CS0645: Identificateur trop long .

La spécification du langage C # définit les identificateurs dans la section 2.4.2 de la spécification Unified C # 3.0. En gros, il s'agit de "lettre ou trait de soulignement". suivi d'un nombre quelconque de "lettres, chiffres décimaux, caractères de connexion, caractères de combinaison, caractères de mise en forme". Pour utiliser un mot-clé comme identifiant, vous devez mettre le signe @ devant, par exemple. int @int = 5;

Je n'ai pas examiné la spécification CLI, mais je sais qu'elle est légèrement moins restrictive que la spécification C #, car le compilateur C # utilise "indéfinissable". des noms pour des méthodes telles que les méthodes anonymes - elles incluent généralement des crochets, qui sont valides dans la CLI mais pas dans C #.

EDIT: Il n'y a pas de restriction de longueur de nom explicite dans la spécification C #, mais la section 2.4.2 n'a qu'une réservation:

  

Les identificateurs contenant deux caractères de soulignement (U + 005F) consécutifs sont réservés à l’utilisation de la mise en oeuvre. Par exemple, une implémentation peut fournir des mots-clés étendus commençant par deux traits de soulignement.

En d'autres termes, son implémentation précise si un identifiant particulier commençant par __ fonctionnera. (Certains compilateurs peuvent avoir __ toto comme mot clé étendu, d'autres non.)

En fonction de divers endroits dans "Expert .NET 2.0 IL Assembler" (Serge Lidin, Apress), la limite fonctionnelle CIL / CLR est de 1 023 octets telle que codée 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 Common Language Runtime impose une limitation à la longueur du nom de classe complet, spécifiant qu'il ne doit pas dépasser 1 023 octets en codage UTF-8. Le compilateur ILAsm, cependant, n'applique pas cette limitation. Les guillemets simples, s’ils doivent être utilisés pour des noms simples dans ILAsm, sont un outil purement lexical et ne permettent pas d’atteindre les métadonnées; ainsi, ils ne contribuent pas à la longueur totale du nom complet de la classe.

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] [heure 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éthodes] Nom (offset dans le flux #Strings). Le nom de la méthode (n'incluant pas 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 codage UTF-8.

Dans la documentation relative aux métadonnées de la partition II, il est indiqué qu'un identificateur est un ID ou un SQSTRING

Un identifiant est décrit comme

  

une chaîne de caractères contiguë   qui commence par un alphabet   caractère ou l’un des & # 8220; _ & # 8221 ;, & # 8220; $ & # 8221 ;, & # 8220; @ & # 8221; ou   & # 8220;? & # 8221; et est suivi par un nombre quelconque de   Caractères alphanumériques ou l'un des & # 8220; _ & # 8221 ;,   & # 8220; $ & # 8221 ;, & # 8220; @ & # 8221 ;, ou & # 8220;? & # 8221;

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 voulez ajouter 1 caractère supplémentaire, la compilation ne sera pas compilée et, de manière surprenante, la liste des erreurs est également vide!

Modifier: pour mon collègue de la mise à jour VS2013 3, le nom de la classe limit = 1012 . Je ne sais pas pourquoi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top