Какова максимальная длина идентификатора C#/CLI?

какие другие ограничения существуют на имена (помимо очевидной уникальности в пределах области)?

где они определены?

6 ответов


с PDF ECMA-335, Раздел II, раздел 22, " метаданные сохраняют строки имен, созданные компилятором или генератором кода, без изменений. По существу, он лечит каждая строка как непрозрачный объект. В частности, он сохраняет кейс. CLI не налагает никаких ограничений на длину имен, хранящихся в метаданных и впоследствии обрабатываемых CLI".

Если я правильно прочитал это и контекст правильный, то нет фактического ограничения длины идентификатора в CLR.


в дополнение к другим ответам максимальная длина идентификатора, принимаемая компилятором Microsoft Visual C#, составляет 511 символов. Это можно проверить с помощью следующего кода:

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

длина имени переменной составляет 511 символов. Этот код компилируется, но если к имени добавляется один символ, компилятор выводит error CS0645: Identifier too long.


спецификация языка C# определяет идентификаторы в разделе 2.4.2 унифицированной спецификации C# 3.0. В основном это "буква или подчеркивание", за которым следует любое число"буква, десятичная цифра, соединяющий символ, комбинирующий символ, форматирующий символ". Чтобы использовать ключевое слово в качестве идентификатора нужно поставить @ перед, например,int @int = 5;

Я не смотрел в спецификацию CLI, но я знаю, что это немного менее ограничительно, чем спецификация C#, потому что компилятор C# использует "невыразимые" имена для таких вещей, как анонимные методы - они обычно включают угловые скобки, которые действительны в CLI, но не действительны в C#.

EDIT: в спецификации C# нет явных ограничений длины имени, но в разделе 2.4.2 есть одно резервирование:

идентификаторы, содержащие два последовательных символа подчеркивания (U + 005F), зарезервированы для использования реализацией. Например, реализация может предоставлять расширенные ключевые слова, начинающиеся с двух подчеркивает.

другими словами, это конкретная реализация относительно того, начинается ли конкретный идентификатор с __ будет работать. (Некоторые компиляторы могут иметь __foo как расширенное ключевое слово, а некоторые - нет.)


согласно различным местам в "Expert .NET 2.0 IL Assembler" (Serge Lidin, Apress), функциональный предел CIL/CLR составляет 1,023 байта, как закодировано в UTF-8. Цитаты:

страница 122:

длина любого типа имени в ILAsm не ограничена синтаксически, но правила метаданных накладывают определенные ограничения на длину имени.

страницы:

общеязыковая среда выполнения накладывает ограничение на полное имя класса длина, указывающая, что она не должна превышать 1,023 байта в кодировке UTF-8. Однако компилятор ILAsm не применяет это ограничение. Одинарные кавычки, если они используются для простых имен в ILAsm, являются чисто лексическим инструментом и не попадают в метаданные; таким образом, они не способствуют общей длине полного имени класса.

страница 143:

[typedef Table] объединенная длина строк, на которые ссылаются записи Name и Namespace, должна не превышает 1,023 байта.

страница 144:

[таблица TypeRef] [время выполнения] объединенная длина строк, на которые ссылаются записи Name и Namespace, не должна превышать 1,023 байта.

страница 186:

[таблица методов] имя (смещение в потоке # Strings). Имя метода (не включая имя класса, которому принадлежит метод). Эта запись должна индексировать строку ненулевой длины не более 1,023 байта в кодировке UTF-8.


глядя в документах метаданных раздела II, он утверждает, что идентификатор является либо идентификатором, либо SQSTRING

идентификатор описывается как

непрерывная строка символов который начинается с буквы характер или один из "_ ", "$", "@" или "?"и следует за любым числом буквенно-цифровых символов или любые "_ ", "$", "@"или"?"

что означало бы, что нет предела длины.


Visual Studio 2015 (обновление 3) - C# 6

максимальная длина имени класса = 993 символы

    public class AaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAZZZ
{            
}

Если вы добавите к нему еще 1 символ, он не компилируется, и удивительно, что список ошибок тоже пуст!

Edit: для моего коллеги с обновлением VS2013 3 ограничение имени класса = 1012. Не знаю, почему.