Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

Страница 122:

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

Страница 126:

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

Страница 143:

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

Страница 144:

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

Страница 186:

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

Ответ 5

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

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

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

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

Ответ 6

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

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

    public class AaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAZZZ
{            
}

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

Изменить: для моего коллеги с VS2013 Update 3 имя класса limit = 1012. Не знаю, почему.