sirven - ¿Cuál es la longitud máxima de un identificador C#/ CLI?
palabras reservadas en c# y su significado (6)
¿Qué otras restricciones existen en los nombres (además de la obvia singularidad dentro de un alcance)?
¿Dónde están esos definidos?
La especificación del lenguaje C # define los identificadores en la sección 2.4.2 de la especificación Unified C # 3.0. Básicamente es "letra o guión bajo" seguido de cualquier cantidad de "letra, dígito decimal, carácter de conexión, carácter de combinación, carácter de formateo". Para usar una palabra clave como identificador, debe poner @ al frente, por ejemplo, int @int = 5;
No he investigado la especificación CLI, pero sé que es un poco menos restrictiva que la especificación C #, porque el compilador C # usa nombres "indescriptibles" para cosas como métodos anónimos; estos suelen incluir corchetes angulares, que son válidos en la CLI pero no válido en C #.
EDITAR: no hay restricciones explícitas de longitud de nombre en la especificación C #, pero la sección 2.4.2 sí tiene una reserva:
Los identificadores que contienen dos caracteres de guión bajo consecutivos (U + 005F) están reservados para ser utilizados por la implementación. Por ejemplo, una implementación puede proporcionar palabras clave ampliadas que comiencen con dos guiones bajos.
En otras palabras, es específico de la implementación si un identificador particular que comienza con __
funcionará. (Algunos compiladores pueden tener __foo
como una palabra clave extendida, y algunos no).
Visual Studio 2015 (actualización 3) - C # 6
Longitud máxima del nombre de clase = 993 caracteres
public class AaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAZZZ
{
}
Si agregas 1 caracter más, no se compila y, sorprendentemente, la lista de errores también está vacía.
Editar: Para mi colega con VS2013 Actualización 3, el límite de nombre de clase = 1012 . No sé la razón por qué.
Del PDF de ECMA-335 , Partición II, sección 22, "Los metadatos conservan las cadenas de nombre, tal como las creó un compilador o generador de código, sin cambios. Básicamente, trata cada cadena como un blob opaco. En particular, conserva el caso. La CLI no impone ningún límite a la longitud de los nombres almacenados en metadatos y posteriormente procesados por la CLI ".
Si lo he leído correctamente y el contexto es correcto, entonces no hay un límite real para la longitud de un identificador en el CLR.
En los documentos de Metadatos de la Partición II, indica que un identificador es una ID o un SQSTRING
Una ID se describe como
una cadena contigua de caracteres que comienza con un carácter alfabético o uno de "_", "$", "@" o "?" y va seguida de cualquier número de caracteres alfanuméricos o cualquiera de "_", "$", "@" O "?"
Lo que implicaría que no hay límite de longitud.
Además de las demás respuestas, la longitud máxima del identificador que acepta el compilador de Microsoft Visual C # es de 511 caracteres . Esto se puede probar con el siguiente código:
class Program
{
private static void Main(string[] args)
{
int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 5;
}
}
La longitud del nombre de la variable hay 511 caracteres. Este código se compila, pero si se agrega un carácter al nombre, el compilador genera el error CS0645: Identifier too long
.
Según varios lugares en "Expert .NET 2.0 IL Assembler" (Serge Lidin, Apress), el límite funcional de CIL / CLR es de 1.023 bytes como está codificado en UTF-8. Citas:
Página 122:
La longitud de cualquier clase de nombre en ILAsm no está limitada sintácticamente, pero las reglas de metadatos imponen ciertas limitaciones en la longitud del nombre.
Página 126:
El tiempo de ejecución de lenguaje común impone una limitación en la longitud del nombre de clase completo, especificando que no debe exceder 1,023 bytes en codificación UTF-8. El compilador ILAsm, sin embargo, no aplica esta limitación. Las comillas simples, si se usan para nombres simples en ILAsm, son una herramienta puramente léxica y no llegan a los metadatos; por lo tanto, no contribuyen a la longitud total del nombre de clase completo.
Página 143:
[Tabla TypeDef] La longitud combinada de las cadenas a las que hacen referencia las entradas Name y Namespace no debe exceder los 1.023 bytes.
Página 144:
[Tabla de TypeRef] [tiempo de ejecución] La longitud combinada de las cadenas a las que hacen referencia las entradas de nombre y espacio de nombres no debe exceder los 1.023 bytes.
Página 186:
[Tabla de métodos] Nombre (desplazamiento en la secuencia #Strings). El nombre del método (sin incluir el nombre de la clase a la que pertenece el método). Esta entrada debe indexar una cadena de longitud distinta de cero de 1.023 bytes en codificación UTF-8.