Подтвердить что ты не робот

Почему встроенные типы в С# являются языковыми ключевыми словами?

В С# идентификаторы, такие как int или string, на самом деле являются ключевыми словами на уровне языка.
В чем причина этого?

Обратите внимание, что если авторы хотели запретить типы пользователей с этими именами, это могло бы сделать семантическую ошибку, а не синтаксическую ошибку.

Некоторые пояснения, основанные на ответах:

  • Они являются ключевыми словами, потому что это делает синтаксический анализ возможным/проще Я не понимаю, почему, поскольку я разрабатываю парсер, а Type.Rule = Identifier намного проще, чем Type.Rule = Identifier | "int" | "string" | ....

  • Это ключевые слова, потому что они являются особыми псевдонимами
    var и dynamic также являются особыми вещами, но не ключевыми словами (по соображениям совместимости, тем не менее, он демонстрирует, что быть ключевым словом необязательно быть специальным). В другом примере, применяя [Serializable] к типу, создается модификатор метаданных магии IL serializable вместо стандартного настраиваемого атрибута. Но это еще не ключевое слово.

  • Это ключевые слова, потому что они были ключевыми словами на других языках
    Хороший ответ, но тогда, почему они являются ключевыми словами на других языках? Кроме того, можно выделить их синим цветом, если они не являются ключевыми словами, поэтому зачем использовать это на других языках?

4b9b3361

Ответ 1

Насколько я читал, дизайнеры С# хотели разрешить типичные имена типов, как это обычно бывает в языках C-стиля, а именно string, int и т.д. В то же время каждый из этих типов должен иметь полнофункциональные имена типов, такие как System.String и System.Int32. Поэтому было решено предоставить псевдонимы для этих часто используемых типов.

Если я снова найду источник для этого утверждения, я добавлю ссылку.

В других языках на основе CLI действуют те же идентификаторы полного идентификатора. Однако имена типов, такие как int или string, могут быть не обычными в таких языках, поэтому там могут быть предоставлены другие псевдонимы.

Одним из возможных преимуществ использования псевдонима типа может быть улучшенная читаемость, поэтому существует правило StyleCop, которое обеспечивает использование псевдонима над регулярное имя типа. Пункт о краткости также упоминается в этой теме в той же теме.

Ответ 2

Почти язык, который я узнал так: C, С++, Java, Pascal, С#. Я действительно не уверен, но согласно классу Compiler Design, я узнал в университете (на этом курсе мы узнаем, как люди пишут компилятор, шаг за шагом и реализуют собственный компилятор), главная причина вашего вопроса:: для облегчения фразы Лексический анализ

При кодировании всего кода просто AN простая строка. и компилятор должен сделать много фраз перед их компиляцией.

Например, при вводе:

int a = 5;

Первая фраза: Лексический анализ должен дать словарь, как показано ниже, и отправить Parser pharse:

    int ---> identifiers
    a   ---> Variable
    =   ---> Operator(=)
    5   ---> Integer
    ;   ---> ;

И как Lexical Analysis знать это: во-первых, он будет строить таблицу словаря и искать строку, которую вы вводите. Когда встречается токенизатор первый, он будет STOP и примет этот токенизатор. (Это важно!)

словарь выглядит следующим образом:

if   ---> if
then ---> then
int  ---> int
.... // all keywords here
[a-z][a-z0-9_]* ---> variable  // example of regular expression :  I don't sure it true, just something like this :D

Итак, если язык позволяет вам называть int как переменную. например:

int int = 5;

Вышеуказанный метод для Lexical Analysis сломанный, когда он читает второй int, он не знает его как переменную или ключевое слово и должен иметь более сложные шаги для его определения.

Я не говорю, что это невозможно, но это сложнее и медленнее при компиляции и не нужно. Просто скажите просто программисту: "Эй, НЕ ДЕЛАЙТЕ ЭТО, или, я не буду компилировать вашу программу:))"

Надеюсь, что это полезно:)

Ответ 3

Это связано с тем, что int и другие специальные типы значений, встроенные в язык С#, на самом деле не являются типами, но псевдонимы системы .NET Framework типы.

Причина, по которой это синтаксическая ошибка, а не семантическая ошибка, - это просто потому, что ошибки обнаруживаются в фазе обнаружения синтаксической ошибки, которая происходит до семантической. Синтаксическое обнаружение ошибок имеет всю необходимую ему информацию, чтобы определить, используется ли int как тип или как что-то еще. Скажем, мы имеем следующее правило:

declaration = type identifier ;

Синтаксическая фаза проверяет, является ли идентификатор [a-Z] ([a-Z] + | [0-9] +) + и не является зарезервированным ключевым словом или псевдонимом, который в том случае, если вы его описали. Поэтому имеет смысл называть это синтаксической ошибкой.