VB действительно нечувствителен к регистру?

Я не пытаюсь запустить аргумент здесь, но по любой причине, обычно указывается, что Visual Basic нечувствителен к регистру, и языки C не (и так или иначе который является хорошей вещью).

Но вот мой вопрос: Где точно действительно ли Visual Basic нечувствителен к регистру? Когда я ввожу...

Dim ss As String
Dim SS As String

... в  Visual Studio 2008 или IDE Visual Studio 2010, второй имеет предупреждение "Локальной переменной SS уже объявляется в текущем блоке". В VBA VBE это сразу не ударяет ошибку, а скорее просто автоматически корректирует случай.

Я пропускаю что-то здесь с этим аргументом, что Visual Basic не чувствителен к регистру? (Кроме того, если бы Вы знаете или хотите ответить, почему это было бы плохой вещью?)

Почему я даже задаю этот вопрос?

Я использовал Visual Basic на многих его диалектах уже много лет, иногда как человек, увлеченный своим хобби, иногда для маленьких связанных с бизнесом программ в рабочей группе. По состоянию на прошлые шесть месяцев я работал над большим проектом, намного больше, чем я ожидал. Большая часть демонстрационного исходного кода там находится в C#. У меня нет острого желания изучить C#, но если бы существуют вещи, которые я пропускаю те предложения C#, которые тот Visual Basic не делает (противоположное было бы литералами XML предложений VB.NET), затем я хотел бы знать больше о той функции. Так в этом случае часто утверждается, что языки C чувствительны к регистру, и это хорошо, и Visual Basic нечувствителен к регистру, и это плохо. Я хотел бы знать...

  1. Как точно Visual Basic, нечувствительный к регистру, так как каждый пример в редакторе кода становится чувствительным к регистру (значение, что случай исправлен), хочу ли я его или нет.
  2. Это заставляет достаточно, чтобы я рассмотрел перемещение в C#, если случай VB.NET так или иначе ограничивает то, что я мог сделать с кодом?

118
задан Robert Todar 24 May 2019 в 17:41
поделиться

8 ответов

Разница между VBA и VB.NET заключается только в том, что VB.NET непрерывно компилируется в фоновом режиме. Вы получите сообщение об ошибке при компиляции VBA.

Как Джонатан говорит , при программировании вы можете думать о VB.NET как о нечувствительности к регистру, помимо сравнения строк, XML и некоторых других ситуаций ...

Я думаю, что вы интересует что под капотом. Что ж, среда выполнения .NET Common Language Runtime чувствительна к регистру , а код VB.NET зависит от среды выполнения, поэтому вы можете видеть, что она должна быть чувствительной к регистру во время выполнения, например когда он ищет переменные и методы.

Компилятор и редактор VB.NET позволяют вам игнорировать это - потому что они исправляют регистр в вашем коде.

Если вы поиграете с динамическими функциями или поздним связыванием (Option Strict Off), вы можете доказать, что базовая среда выполнения чувствительна к регистру. Другой способ убедиться в этом - понять, что языки с учетом регистра, такие как C #, используют одну и ту же среду выполнения, поэтому среда выполнения, очевидно, поддерживает чувствительность к регистру.

РЕДАКТИРОВАТЬ Если вы хотите исключить IDE из уравнения, вы всегда можете скомпилировать из командной строки . Измените свой код в Блокноте , чтобы он имел ss и SS , и посмотрите, что делает компилятор.

РЕДАКТИРОВАТЬ Цитата из Джеффри Рихтера в Рекомендациях по проектированию .NET Framework стр. 45.

Для ясности, CLR на самом деле -чувствительный.Некоторые языки программирования , например Visual Basic, не чувствительны к регистру . Когда компилятор Visual Basic пытается разрешить вызов метода для типа , определенного в чувствительном к регистру языке , таком как C #, компилятор (не CLR) определяет реальный регистр имени метода и встраивает его в метаданные . CLR ничего не знает об этом . Теперь, если вы используете отражение для привязки к методу, API отражения действительно предлагают возможность поиска без учета регистра. Это степень, в которой CLR предлагает нечувствительность к регистру.

106
ответ дан 24 November 2019 в 01:59
поделиться

Да, VB нечувствителен к регистру. Это иногда ставит в тупик тех, кто к этому не привык.

1
ответ дан 24 November 2019 в 01:59
поделиться

Да, компилятор VB.NET обрабатывает идентификаторы без учета регистра. И да, это может вызвать проблемы, когда он потребляет сборки, написанные на другом языке, или использует COM-компоненты. Первый случай рассматривается в Спецификации общего языка. Соответствующее правило гласит:

Для того чтобы два идентификатора считались разными, они должны различаться более чем просто регистр.

О регистре COM довольно грубо заботится построитель библиотеки типов, он заставляет регистр идентификаторов с одинаковым именем быть одинаковым. Даже если эти идентификаторы имеют разные роли. Другими словами, параметр метода с именем "index" заставит имя метода "Index" быть преобразованным в "index". Это вызвало довольно много головных скрежетов, как вы можете себе представить :)

9
ответ дан 24 November 2019 в 01:59
поделиться

Это часть используемого вами редактора, они могут вести себя по-разному, но факт в том, что Visual Basic действительно является языком без учета регистра. Итак, SS и SS одинаковы.

Пожалуйста, посмотрите учебник по основам VB.NET для получения дополнительной информации:)

5
ответ дан 24 November 2019 в 01:59
поделиться

VB в основном нечувствителен к регистру, но есть исключения. Например, литералы и понимание XML чувствительны к регистру. Сравнение строк обычно чувствительно к регистру, в отличие, скажем, от T-SQL, но есть переключатель компилятора, чтобы сравнение строк было нечувствительным к регистру. И, конечно же, есть крайние случаи, когда мы имеем дело с наследованием, COM и динамическим языком выполнения.

16
ответ дан 24 November 2019 в 01:59
поделиться

Часть проблемы здесь заключается в том, что вам нужно разделить язык и опыт работы с IDE.

Как язык, VB.NET, безусловно, нечувствителен к регистру в отношении идентификаторов. Вызов DateTime.Parse и datetime.parse привяжется к совершенно одинаковому коду. И в отличие от таких языков, как C#, здесь невозможно определить методы или типы, отличающиеся только регистром.

Как IDE, VB.NET пытается сохранить регистр существующих идентификаторов, когда выводит красивые списки блока кода. Красивые списки возникают всякий раз, когда вы отходите от текущей логической строки кода. В данном случае вы переходите от второго объявления SS, красивое перечисление замечает, что существует идентификатор с таким именем, и исправляет его на соответствующий регистр.

Это поведение, однако, сделано исключительно в качестве пользовательского дополнения. Оно не является частью основного языка.

21
ответ дан 24 November 2019 в 01:59
поделиться

Я не уверен, что понимаю вас? VB нечувствителен к регистру, поэтому ss и SS - это одна и та же переменная, поэтому компилятор правильно жалуется, что вы повторно объявили переменную.

Я думаю, что переменные не чувствительны к регистру, но имена функций чувствительны.

3
ответ дан 24 November 2019 в 01:59
поделиться

Не нужно изо всех сил пытаться использовать VB.NET для создания кода с разными прописными и строчными буквами "написания" идентификатора. Изменение регистра идентификатора в файле, в котором он объявлен, без использования функции «Переименовать» не приведет к обновлению имени в других файлах, хотя редактирование любой строки, содержащей имя, приведет к его соответствию настоящему определению.

Таким образом, можно определить, что VB.NET в основном нечувствителен к регистру, но делает регистр идентификаторов доступным для среды CLR, которая может использовать эту информацию с учетом регистра.

1
ответ дан 24 November 2019 в 01:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: