Какова максимальная длина идентификатора C # / CLI?
-
06-07-2019 - |
Вопрос
Какие существуют другие ограничения для имен (помимо очевидной уникальности в области видимости)?
Где они определены?
Решение
Из 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 . Не знаю причину почему.