Какова максимальная длина идентификатора C#/CLI?
какие другие ограничения существуют на имена (помимо очевидной уникальности в пределах области)?
где они определены?
6 ответов
с 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: Identifier too long
.
спецификация языка C# определяет идентификаторы в разделе 2.4.2 унифицированной спецификации C# 3.0. В основном это "буква или подчеркивание", за которым следует любое число"буква, десятичная цифра, соединяющий символ, комбинирующий символ, форматирующий символ". Чтобы использовать ключевое слово в качестве идентификатора нужно поставить @ перед, например,int @int = 5;
Я не смотрел в спецификацию CLI, но я знаю, что это немного менее ограничительно, чем спецификация C#, потому что компилятор C# использует "невыразимые" имена для таких вещей, как анонимные методы - они обычно включают угловые скобки, которые действительны в CLI, но не действительны в C#.
EDIT: в спецификации C# нет явных ограничений длины имени, но в разделе 2.4.2 есть одно резервирование:
идентификаторы, содержащие два последовательных символа подчеркивания (U + 005F), зарезервированы для использования реализацией. Например, реализация может предоставлять расширенные ключевые слова, начинающиеся с двух подчеркивает.
другими словами, это конкретная реализация относительно того, начинается ли конкретный идентификатор с __
будет работать. (Некоторые компиляторы могут иметь __foo
как расширенное ключевое слово, а некоторые - нет.)
согласно различным местам в "Expert .NET 2.0 IL Assembler" (Serge Lidin, Apress), функциональный предел CIL/CLR составляет 1,023 байта, как закодировано в UTF-8. Цитаты:
страница 122:
страницы:длина любого типа имени в ILAsm не ограничена синтаксически, но правила метаданных накладывают определенные ограничения на длину имени.
общеязыковая среда выполнения накладывает ограничение на полное имя класса длина, указывающая, что она не должна превышать 1,023 байта в кодировке UTF-8. Однако компилятор ILAsm не применяет это ограничение. Одинарные кавычки, если они используются для простых имен в ILAsm, являются чисто лексическим инструментом и не попадают в метаданные; таким образом, они не способствуют общей длине полного имени класса.
страница 143:
[typedef Table] объединенная длина строк, на которые ссылаются записи Name и Namespace, должна не превышает 1,023 байта.
страница 144:
[таблица TypeRef] [время выполнения] объединенная длина строк, на которые ссылаются записи Name и Namespace, не должна превышать 1,023 байта.
страница 186:
[таблица методов] имя (смещение в потоке # Strings). Имя метода (не включая имя класса, которому принадлежит метод). Эта запись должна индексировать строку ненулевой длины не более 1,023 байта в кодировке UTF-8.
глядя в документах метаданных раздела II, он утверждает, что идентификатор является либо идентификатором, либо SQSTRING
идентификатор описывается как
непрерывная строка символов который начинается с буквы характер или один из "_ ", "$", "@" или "?"и следует за любым числом буквенно-цифровых символов или любые "_ ", "$", "@"или"?"
что означало бы, что нет предела длины.
Visual Studio 2015 (обновление 3) - C# 6
максимальная длина имени класса = 993 символы
public class AaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAZZZ
{
}
Если вы добавите к нему еще 1 символ, он не компилируется, и удивительно, что список ошибок тоже пуст!
Edit: для моего коллеги с обновлением VS2013 3 ограничение имени класса = 1012. Не знаю, почему.