Действительно ли VB нечувствителен к регистру? - PullRequest
115 голосов
/ 20 февраля 2010

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

Но вот мой вопрос: где именно Visual Basic не учитывает регистр? Когда я печатаю ...

Dim ss As String
Dim SS As String

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

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

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

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

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

Ответы [ 14 ]

101 голосов
/ 20 февраля 2010

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

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

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

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

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

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

РЕДАКТИРОВАТЬ Цитата из Джеффри Рихтера в .NET Framework Guidelines стр. 45.

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

21 голосов
/ 20 февраля 2010

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

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

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

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

16 голосов
/ 20 февраля 2010

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

9 голосов
/ 20 февраля 2010

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

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

Случай с COM довольно грубо заботится сборщиком библиотеки типов: он заставляет идентифицировать идентификаторы одинаковыми именами. Даже когда эти идентификаторы имеют разные роли. Другими словами, параметр метода с именем «index» заставит имя метода «Index» быть возвращенным в «index». Это вызвало довольно много царапин на голове, как вы можете себе представить:)

6 голосов
/ 29 июля 2011

VB сохраняет регистр (в IDE), но регистронезависимо . Это похоже на файловую систему Windows. Hello.txt и hello.txt считаются одним и тем же именем файла.

IDE предполагает, что объявление переменной является «правильным» случаем для этой переменной, и корректирует каждый экземпляр этой переменной в соответствии с объявлением. Это делается из-за приятных глаз и соображений согласованности, но не из-за функциональности.

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

Примечание:

Большинство ЛЮДИ думают без учета регистра. Когда мы видим слово «собака», это слово переводится в значение в наших умах. Значение слова не основано на регистре (то есть независимо от того, произнесено ли по-прежнему «DOG», «DoG» или «dOG»). КОМПЬЮТЕРЫ рассматривают слова как отдельные пакеты битов. Прописные и строчные буквы - это разные битовые комбинации, поэтому они разные.

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

5 голосов
/ 20 февраля 2010

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

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

3 голосов
/ 20 февраля 2010

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

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

1 голос
/ 10 сентября 2018

Скрытие символов (например, локальное поле скрытия) также не учитывает регистр.

Вот пример :

Public Class C
    Public Name As String

    Public Function M(name As String) As Boolean
        Return String.Equals(name, Name) ' case differs
    End Function
End Class

Вывод компилятора VB.NET декомпилируется (и, следовательно, эквивалентен) следующему C #:

public class C
{
    public string Name;

    public bool M(string name)
    {
        return string.Equals(name, name); // both lowercase
    }
}

string.Equals передается в поле дважды. Местный скрыт, независимо от случая. Язык нечувствителен к регистру.

Чтобы явно указать элемент, такой как это поле, необходимо разыменовать элемент с помощью Me:

Return String.Equals(name, Me.Name) ' differentiate field from local
1 голос
/ 27 сентября 2013

Я постараюсь ответить на ваш второй вопрос.

"Достаточно ли этого для меня, чтобы подумать о переходе на C #, если дело VB.NET каким-то образом ограничивает то, что я могу сделать с кодом?"

Создать WCF WebService с использованием C #. Создайте DataContract (1 класс). Один со свойством "string email". Другой со строкой Email в качестве другого свойства. Ваш выбор понимать как личную электронную почту или офисную электронную почту. Или это может быть в двух разных DataContracts.

Для C # это нормально. Веб-сервис создан отлично. Программа на C # может легко создать WSDL, и все в порядке.

Теперь попробуйте создать WSDL с VB (любая версия). Он скажет, что «электронная почта» уже объявлена, и генерация WSDL не удалась.

Как и все, я предполагал, что это недостаток языка VB. Но !!!

Используйте FxCOP и проанализируйте исходный код C #. FxCOP говорит, что использование электронной почты / электронной почты является проблемой. Рекомендует использовать другое имя, поддерживающее регистронезависимость. Также обратите внимание, что на сегодняшний день .NET Framework имеет 106 языков программирования, и есть много языков с включенной чувствительностью к регистру. Мы все движемся к облаку и хотим, чтобы наши услуги были доступны для всех платформ / языков программирования.

Таким образом, чувствительность к регистру - ваш выбор в вашей программе, и если вы парень на C, вам это понравится. Если программа будет использоваться / использоваться другими программами, не относящимися к Си, вам необходимо поддерживать регистронезависимость, но ваш язык - ваш выбор.

http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Visual_Basic_.NET http://www.vbrad.com/article.aspx?id=65

1 голос
/ 17 мая 2013

Я могу только предложить это, что, как я помню из моих учебников по программированию в начале 80-х годов, заключается в том, что языки, чувствительные к регистру, были (в то время) строго предназначены для уменьшения ошибок во время компиляции. То есть «строгость» предназначалась для разработки дисциплины кодирования с большей точностью. Как оказалось, добавилось правильное обозначение переменных, классов, методов, функций и всего, что вы хотели бы добавить туда, а также.

Я помню, что почти во всех этих книгах содержалась рекомендуемая схема ввода заглавных букв, строчных букв и т. Д. Как мы все знаем, многое из этого было выброшено или, я бы сказал, проигнорировано на практике, за исключением производства высокого класса дома, и решения CASE, или для тех, кто достиг более высокого уровня квалификации. Я думаю, что каждый испытывает эту кривую обучения.

Учитывая продвижение этих языков и IDE, возникает вопрос: какой язык улучшает время разработки? Конечно, если вы не знакомы с каждым из различных языков, ваши возможности ограничены.

...