Действительно ли 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 ]

1 голос
/ 15 июля 2010

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

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

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

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

0 голосов
/ 25 января 2014

Я не видел, чтобы кто-то прокомментировал ваш явный 2-й вопрос в конце: «2: достаточно ли этого для меня, чтобы подумать о переходе на C #, если случай VB.NET каким-то образом ограничивает то, что я могу сделать с кодом?» 1001 *

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

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

когда впервые появился C #, у VB не было своих комментариев XML, которые вы могли бы поместить перед методами, которые я любил в C #. Я ненавидел это в VB.NET. но я видел на протяжении многих лет, что многие функции, которые не на одном языке, добавляются к другому. (Одна и та же команда разработчиков MS разрабатывает и C #, и VB, поэтому имеет смысл, что функции должны стать очень похожими.)

но вы спросили, что у C # есть у того, чего нет у VB. вот некоторые, о которых я могу думать сразу:

1: C # более лаконичен и требует меньше печатания .. МНОГИМИ способами! я даже видел глупость говорить, когда делается обратное утверждение, что VB экономит печатать. но, пожалуйста, послушайте людей, которые говорят вам, что они используют оба языка, и они редко используются ими. Я использую как C # , так и VB, C # дома, потому что мне это нравится (и когда я работаю с C # на работе), и мои последние запросы на работу, которые я использую VB, а не C #. так что сейчас я все чаще использую VB (около 10 месяцев), но по моим личным показаниям я предпочитаю C #, а с точки зрения фактической типизации VB значительно больше печатает. один пример, который я читал, когда кто-то на самом деле пытался сказать, что VB был более лаконичен, приводил пример 'with ...' с длинной переменной в with, поэтому в VB вы можете просто использовать '.property'. глупо утверждать, что VB нужно меньше печатать. Есть несколько вещей (и не только этот пример), когда VB короче, но гораздо больше, когда C # является более кратким, в реальной практике.

но главная причина, по которой я считаю C # более лаконичной, это подробные заявления VB "IF / THEN". если заявления являются общими. в C # нет слова «тогда» для ввода! :) также все операторы 'end ...' принимают типизацию, которая в c # обычно представляет собой одну закрывающую скобку '}'. Я читал, что некоторые люди утверждают, что эта большая многословность в VB.NET является преимуществом для VB, поскольку несколько операторов / символов закрывающих блоков могут быть вложенными и заканчиваться непосредственно рядом друг с другом, но я совершенно не согласен. человек почти всегда может написать программу лучше на C # или VB, чем другой программист, потому что следующая версия кода может быть разработана лучше. это относится к «путанице в многочисленных закрывающих скобках в C #», плюс, если вложенные блоки имеют одинаковый тип, например несколько вложенных IF, тогда VB испытывает ту же проблему, что и в C #. это не преимущество в VB. именно в этой ситуации я и хотел бы прокомментировать, что означает мой закрывающий символ или закрывающее утверждение на обоих языках. да, это более многословно, но на любом языке у вас есть возможность прояснить ситуацию, что важно в конкретных ситуациях, основанных на суждениях. Я думаю, что ясность кода очень важна.

2: VB не имеет многострочных комментариев. когда я работал с VB, я не возражал. Затем я перешел на несколько языков в стиле Си. сейчас я вернулся, в основном, использую VB.NET на работе, и мне их не хватает. это просто то, что вы считаете удобным, а потом должны потерять. (

3: VB 'andalso' и 'orelse' довольно раздражает, когда печатает все это, когда в C # это просто '&&' и '||'. опять же меньше печатать. это не редкость в моем коде как в VB, так и в C #. во всяком случае, для функциональности «ИЛИ» против «OrElse» обычно не имеет значения, за исключением того, что «OrElse» быстрее для компьютера, поэтому, если программист просто использует «И» и «И» в VB, он производит менее оптимальный код для тот, кто любит ясность кода. «Или» гораздо проще, чем «OrElse».

4: больше гибкости в размещении кода в C #. когда строка длинная и вы хотите обернуть ее на следующей строке, я ненавижу «контролирующую» перенастройку моего кода в VB.NET. C # делает это немного, но я нахожу это более полезным в C #, где в VB это намного более контролирующе. но это больше IDE VB.NET против C # IDE, чем сам язык. но я не знаю, хотите ли вы оба или чисто языковые функции без IDE-различий.

5: один, который мне действительно не хватает, это просто создание нового блока кода на C #, у меня может быть много событий в методе, и я хочу объявить переменную в очень маленьком блоке кода, но эта переменная не была объявлена ​​снаружи этот блок во всем методе. в C # мы можем просто создать новый блок с помощью '{' и завершить его с помощью '}'. VB не имеет такой функции, но его наиболее близким совпадением является безусловный блок «If True Then» и «End If». (обратите внимание, 2-символьный C # против 18-символьного VB.NET-эквивалента снова ... подробнее вводим в VB.)

6: операторы собственного увеличения и уменьшения: ++ и - как в myVariable++ или ++myVariable или эквивалентных версиях уменьшения. это очень удобно ... иногда. Вот пример реального кода, когда я сильно скучал по C #:

// C#:
while (txt.Length > x)
{
    thisChar = txt[x];
    if (charsAllowedWithoutLimit.Contains(thisChar)) { ++x; }
    else if (allowLettersWithoutLimit && char.IsLetter(thisChar)) { ++x; }
    else if ((x2 = charsAllowedWithLimit.IndexOf(thisChar)) >= 0)
    {
        ++x; if (++usedCountA[x2] > charAllowedLimit[x2]) { break; }
    }
    else { break; }
}

' VB.NET:
While (txt.Length > x)
    thisChar = txt(x)
    If (charsAllowedWithoutLimit.Contains(thisChar)) Then
        x += 1
    ElseIf (allowLettersWithoutLimit AndAlso Char.IsLetter(thisChar)) Then
        x += 1
    Else
        x2 = charsAllowedWithLimit.IndexOf(thisChar)
        If (x2 >= 0) Then
            x += 1
            usedCountA(x2) += 1S
            If usedCountA(x2) > charAllowedLimit(x2) Then Exit While
        Else
            Exit While
        End If
    End If
End While

И просто приведу ОЧЕНЬ хороший пример, где правила C #, это больше кода, который я лично написал недавно:

// C#
public static bool IsNotWithin(this Byte   v, Byte   v1, Byte   v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this SByte  v, SByte  v1, SByte  v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Int16  v, Int16  v1, Int16  v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Int32  v, Int32  v1, Int32  v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Int64  v, Int64  v1, Int64  v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this UInt16 v, UInt16 v1, UInt16 v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this UInt32 v, UInt32 v1, UInt32 v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this UInt64 v, UInt64 v1, UInt64 v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Decimal v, Decimal v1, Decimal v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }

public static bool IsWithin(this Byte   v, Byte   v1, Byte   v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this SByte  v, SByte  v1, SByte  v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Int16  v, Int16  v1, Int16  v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Int32  v, Int32  v1, Int32  v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Int64  v, Int64  v1, Int64  v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this UInt16 v, UInt16 v1, UInt16 v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this UInt32 v, UInt32 v1, UInt32 v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this UInt64 v, UInt64 v1, UInt64 v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Decimal v, Decimal v1, Decimal v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }

' And the VB equivalent is a mess! Here goes:
<Extension()>
Public Function IsNotWithin(v As Byte, value1 As Byte, value2 As Byte) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As SByte, value1 As SByte, value2 As SByte) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As Int16, value1 As Int16, value2 As Int16) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

' the % suffix means 'As Integer' in VB.
<Extension()>
Public Function IsNotWithin(v%, value1%, value2%) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

' the & suffix means 'As Long' in VB.
<Extension()>
Public Function IsNotWithin(v&, value1&, value2&) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As UInt16, value1 As UInt16, value2 As UInt16) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As UInt32, value1 As UInt32, value2 As UInt32) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As UInt64, value1 As UInt64, value2 As UInt64) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

' the @ suffix means 'As Decimal' in VB.
<Extension()>
Public Function IsNotWithin(v@, value1@, value2@) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsWithin(v As Byte, value1 As Byte, value2 As Byte) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As SByte, value1 As SByte, value2 As SByte) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As Int16, value1 As Int16, value2 As Int16) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

' the % suffix means 'As Integer' in VB.
<Extension()>
Public Function IsWithin(v%, value1%, value2%) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

' the & suffix means 'As Long' in VB.
<Extension()>
Public Function IsWithin(v&, value1&, value2&) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As UInt16, value1 As UInt16, value2 As UInt16) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As UInt32, value1 As UInt32, value2 As UInt32) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As UInt64, value1 As UInt64, value2 As UInt64) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

' the @ suffix means 'As Decimal' in VB.
<Extension()>
Public Function IsWithin(v@, value1@, value2@) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

Возможно, это свидетельство того, что C # более лаконичен. Но не всем программистам нравится краткость. Некоторые предпочитают читать «если a Я также думаю, что необходимость использовать 'c' после символьных литералов в VB, чтобы сделать его символьным литералом, а не строкой, раздражает. Мне нравится краткость C # с этим гораздо больше. когда метод требует символьного литерала, вам нужно предоставить символ, а не строку с длиной одного символа, поэтому иногда вы вынуждены использовать ":"c в VB, тогда как в C # это ':'. я думаю, что это придирки.

Чтобы быть справедливым, я скажу, что есть преимущества, которые мне нравятся в VB, такие как отсутствие необходимости ставить пустые скобки после вызова метода, например Dim nameUpper$ = name.ToUpperInvariant, где C # требует пустых скобок: string nameUpper = name.ToUpperInvariant(). или вдвое больше, чем при обрезке: Dim nameUpper$ = name.Trim.ToUpperInvariant против string nameUpper = name.Trim().ToUpperInvariant(). Мне нравится краткое использование VB того, как я только что использовал $ выше, чтобы затемнить 'As String', где C # не имеет этих ярлыков. В VB есть такие сочетания клавиш для типов String, Integer, Long, Decimal, Single и Double, но недостатком является то, что он менее понятен, поэтому я использую его с осторожностью. но тем не менее я предпочитаю лаконичный код.

Ну, это всего лишь несколько слов от этого опытного программиста, и, как я считаю, это мое «свидетельство» программирования на C # против VB. оба, по моему мнению, хорошие языки. но да, я все еще предпочитаю C #.

p.s. Поскольку я планирую программировать большую часть своей жизни, я даже заново научился печатать, используя самую эффективную клавиатуру: клавиатуру Dvorak, которая требует примерно 1/3 усилий для ввода английского, чем на клавиатуре Qwerty. поищи это. может быть, вы тоже захотите переключиться. ;) это облегчило мой набор текста на 67%! :) Я призываю всех мыслить нестандартно и оценивать эффективность своей работы. Dvorak Упрощенная раскладка клавиатуры и C # сделали это для меня. :)

P.S.S. Я бы сравнил Dvorak и C # с метрикой, в отличие от раскладки клавиатуры Qwerty, а VB - с эмпирическими измерениями. Дворак, метрика и C # просто «чистые». НО VB не сильно отстает. Но он страдает от необходимости быть обратно совместимым со старым кодом VB6 и предварительным кодом .NET, таким как 'Or' против 'OrElse' и 'IIF ()'.

Я закончу с осторожностью. Пожалуйста, будьте осторожнее, слушая людей, которые на самом деле не знают, о чем говорят. Половина всех минусов против VB и C # - , а не - больше не проблема, и люди до сих пор пишут о том, что они не знают о том, какие недостатки на самом деле все еще существуют в языке. Лучший пример, который я могу придумать, это комментарии XML для методов, использующих тройной апостроф в VB или символы комментария тройной косой черты в C #. Но, пожалуйста, убедитесь сами, говорит ли человек по невежеству или по опыту. Личное свидетельство означает, что они знают из своего реального опыта. И после того, как у кого-то есть большой опыт в этом, тогда оживите свои уши. У меня более 10 лет опыта как в C #, так и в VB. И это сводится к следующему: оба (очень) хорошие языки. И большинство различий вы можете увидеть сразу через 5 минут после прочтения кода. Но да, другие функции могут занять годы, чтобы найти препятствие. И один недостаток, который я знаю (в C #), я даже не могу вспомнить ситуацию в реальной жизни, где это было бы полезно. Так что, возможно, это не помеха.

Удачного кодирования!

0 голосов
/ 05 октября 2012

VB.NET нечувствителен к регистру.

Примеры:

1

Dim a As Integer
Dim A as Integer

2.

Sub b()
    'Some statement(s) here
End Sub
Sub B()
    'Some statement(s) here
End Sub

3.

Function c() As Integer
    'Some statement(s) here
End Function
Function C() As Integer
    'Some statement(s) here
End Function

Все эти коды приведут к ОШИБКЕ ВРЕМЕНИ .

В первом примере будет отображена ошибка: «В текущем блоке уже объявлена ​​локальная переменная« A »."

В то время как для 2-го и 3-го примера будет отображаться сообщение об ошибке: «Public Sub b ()» имеет несколько определений с одинаковыми сигнатурами ». и «Public Function c () As Integer» имеет несколько определений с одинаковыми сигнатурами. »соответственно.

Из этих ошибок обратите внимание, что ошибки генерируются в разных позициях для переменных и процедур / функций. Для переменных ошибка генерируется во 2-ом объявлении, а для процедур / функций - в 1-ом объявлении / определении идентичного кода.

Как сказал пользователь в комментарии где-то выше, код VB.NET постоянно проверяется и / или корректируется в фоновом режиме; Вы можете увидеть эту ошибку в окне «Список ошибок» в VS IDE. И поскольку это ОШИБКА и НЕ ПРЕДУПРЕЖДЕНИЕ , код не будет компилироваться, пока ошибка не будет устранена.

...