Вопрос

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

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

Это было полезно?

Решение

Из 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: слишком длинный идентификатор .

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

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

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

  

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

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

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

Страница 122:

  

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

Страница 126:

  

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

Страница 143:

  

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

Страница 144:

  

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

Страница 186:

  

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

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

ID описывается как

  

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

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

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

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

    public class AaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAZZZ
{            
}

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

Изменить. Для моего коллеги с VS2013, обновление 3, ограничение имени класса = 1012 . Не знаю причину почему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top