.Net / CLR идентификаторы
Мне было интересно, какие символы принимаются в идентификаторах.Net?
Не C# или VB.Net, а CLR.
Я спрашиваю это потому, что я смотрю на то, как yield return
операторы были реализованы ( C# In Depth), и увидел, что он компилируется в код как:
public int <count>5__1;
Есть ли другие идентификаторы, которые я мог бы использовать? Этот код не будет общедоступным.
2 ответа
В спецификации C# указано, какие символы можно использовать.
CLR однако позволяет гораздо больше. Вот почему компилятор C# выдает их как таковые.
Это регулируется спецификацией CLS, глава 8.5.1 "Допустимые имена":
Правило 4 CLS: сборки должны следовать Приложению 7 Технического отчета 15 к стандарту Unicode 3.0, регулирующему набор символов, разрешенных для запуска и включаемых в идентификаторы, которые доступны в Интернете по адресу http://www.unicode.org/unicode/reports/tr15/tr15-18.html. Идентификаторы должны быть в каноническом формате, определенном формой нормализации Unicode C. Для целей CLS два идентификатора одинаковы, если их сопоставления в нижнем регистре (как указано в Unicode, нечувствительные к локали, сопоставления в нижнем регистре один к одному) одинаковы. То есть, если два идентификатора считаются разными в соответствии с CLS, они должны отличаться не только в их случае. Однако, чтобы переопределить унаследованное определение, CLI требует точного кодирования исходного объявления.
Или, другими словами, он не определяет список многословных символов, он касается только возможности сравнения строк без неожиданностей. Что все, что CLR когда-либо должен делать. Работа компилятора намного сложнее, он должен уметь распознавать токены в программе, работу лексера. Практические реализации лексера устанавливают правила для допустимых символов в идентификаторе. Например, не начинать идентификатор с цифры.