Какова максимальная длина идентификатора C # / CLI? - PullRequest
27 голосов
/ 09 октября 2008

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

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

Ответы [ 6 ]

51 голосов
/ 10 января 2012

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

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

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

22 голосов
/ 09 октября 2008

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

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

16 голосов
/ 09 октября 2008

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

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

РЕДАКТИРОВАТЬ: В спецификации C # нет явных ограничений длины имени, но раздел 2.4.2 имеет одно резервирование:

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

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

8 голосов
/ 10 января 2012

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

Страница 122:

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

Страница 126:

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

Страница 143:

[TypeDef Table] Общая длина строк, на которые ссылаются записи Name и пространства имен, не должна превышать 1023 байта.

Страница 144:

[Таблица TypeRef] [время выполнения] Общая длина строк, на которые ссылаются записи Name и пространства имен, не должна превышать 1023 байта.

Страница 186:

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

0 голосов
/ 15 марта 2017

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

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

    public class AaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAZZZ
{            
}

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

Редактировать: Для моего коллеги с VS2013 Update 3 ограничение имени класса = 1012 . Не знаю причину почему.

0 голосов
/ 09 октября 2008

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

Идентификатор описан как

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

Что подразумевает отсутствие ограничения по длине.

...