Какие другие ограничения существуют в именах (помимо очевидной уникальности в пределах области)?
Где определены эти?
Какие другие ограничения существуют в именах (помимо очевидной уникальности в пределах области)?
Где определены эти?
Из PDF из ECMA-335, раздел 22 раздела II:" Метаданные сохраняют строки имен, созданные компилятором или генератором кода, без изменений. По сути, это относится к каждая строка в виде непрозрачного блоба. В частности, он сохраняет случай. CLI не налагает ограничений на длину имен, хранящихся в метаданных и впоследствии обрабатываемых CLI ".
Если я прочитал это правильно и контекст правильный, то фактического ограничения длины идентификатора в CLR не существует.
В дополнение к другим ответам максимальная длина идентификатора, принятая компилятором Microsoft Visual С#, составляет 511 символов. Это можно протестировать с помощью следующего кода:
class Program
{
private static void Main(string[] args)
{
int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 5;
}
}
Длина имени переменной составляет 511 символов. Этот код компилируется, но если к имени добавляется один символ, компилятор выводит error CS0645: Identifier too long
.
Спецификация языка С# определяет идентификаторы в разделе 2.4.2 спецификации Unified С# 3.0. В основном это "буква или знак подчеркивания", за которым следует любое число "буква, десятичная цифра, соединительный символ, комбинирующий символ, символ форматирования". Чтобы использовать ключевое слово в качестве идентификатора, вам нужно поставить @впереди, например. int @int = 5;
Я не изучал спецификацию CLI, но я знаю, что она немного менее ограничительна, чем спецификация С#, потому что компилятор С# использует "невыразимые" имена для таких вещей, как анонимные методы - обычно они включают угловые скобки, которые действительны в CLI, но не действителен в С#.
EDIT: в спецификации С# нет ограничений длины имени, но в разделе 2.4.2 есть одно резервирование:
Идентификаторы, содержащие два последовательных символа подчеркивания (U + 005F), зарезервированы для использования реализацией. Например, реализация может предоставлять расширенные ключевые слова, начинающиеся с двух символов подчеркивания.
Другими словами, это конкретная реализация, касающаяся того, будет ли работать конкретный идентификатор, начинающийся с __
. (Некоторые компиляторы могут иметь __foo
как расширенное ключевое слово, а некоторые - нет.)
Согласно различным местам в "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.
Глядя в документах метаданных раздела II, он указывает, что идентификатор является либо идентификатором, либо SQSTRING
Идентификатор описывается как
непрерывная строка символов который начинается либо с буквы символ или один из "_", "$", "@" или "?" и за ним следует любое количество буквенно-цифровые символы или любые "_", "$", "@" или "?"
Это означает, что нет предела длины.
Visual Studio 2015 (обновление 3) - С# 6
Максимальная длина имени класса = 993.
public class AaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAZZZ
{
}
Если вы добавите к нему еще 1 символ, он не будет компилироваться и, что удивительно, список ошибок также пуст!
Изменить: для моего коллеги с VS2013 Update 3 имя класса limit = 1012. Не знаю, почему.