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

Я не пытаюсь начать аргумент здесь, но по какой-то причине обычно утверждается, что 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#, но если есть то, что я упускаю из виду.# предложения, которые Visual Basic не делает (противоположность было бы VB.NET предложения XML-литералы), то я хотел бы знать подробнее об этой функции. Так что в этом случае, он часто утверждал, что с языки чувствительны к регистру и это хорошо, и Visual Basic-это case бесчувственный, и это плохо. Я бы люблю знать...

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

14 ответов


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

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

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

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

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

редактировать если вы хотите вывести IDE из уравнения, вы всегда можете компиляция из командной строки. Отредактируйте код в Блокнот вот это ss и SS и посмотрите, что делает компилятор.

редактировать цитата Джеффри Рихтер на .Net дизайн общие рекомендации


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

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

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

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


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


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

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

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


В. Б. случае сохранения (в IDE), но регистр. Это похоже на файловую систему Windows. Привет.TXT и привет.txt считается тем же именем файла.

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

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

сторона-Примечание:

большинство человек думайте без учета регистра. Когда мы видим слово "собака", это слово в нашем сознании переводится в значение. Значение слова не основано на падеже (т. е. независимо от того, если по буквам" собака"," собака "или" собака " все еще лает.) компьютеры см. слова как дискретные мешки битов. Верхний и Нижний регистры - это разные битовые шаблоны и, следовательно, разные.

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


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

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


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

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


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


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

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


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

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

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


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

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

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

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

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

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

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

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

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


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

Я предпочитаю более альтернативный подход, который 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, поэтому в VB вы можете просто использовать '.собственность". это глупость утверждать, что VB нуждается в меньшем наборе текста. есть несколько вещей (и не только этот пример), где VB короче, но и многое другое времена, когда C# более лаконичен, в реальной практике.

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

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

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

4: больше гибкости в размещении кода в C#. когда очередь длинная и ты хочешь закончить ее на следующей строке, я ненавижу VB.NET " s "управление" корректировка моего кода. C# делает это немного, но я нахожу его более полезным в C#, где в VB он намного более контролирует. но это больше из VB.NET IDE vs 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

возможно, это доказательство enuf, что C# более лаконичен. Но не всем программистам нравится краткость. Некоторые предпочитают читать "если a

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

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

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

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

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

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

удачи в кодировании!


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

эти все код бросит ОШИБКА ВРЕМЕНИ КОМПИЛЯЦИИ.

для 1-го примера будет показана ошибка, говорящая, что "локальная переменная 'A' уже объявлена в текущем блоке.".

В то время как для 2-го и 3-го примера будет показана ошибка "'Public Sub b ()' имеет несколько определений с одинаковые подписи."и "'публичная функция c () как целое число' имеет несколько определений с идентичными сигнатурами.", соответственно.

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

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


скрытие символов (например. local hides field)также нечувствителен к регистру.

здесь пример:

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 передается поле дважды. Местное скрыто, независимо от случая. Язык нечувствителен к регистру.

чтобы явно ссылаться на элемент a, например на это поле, необходимо разыменовать элемент via Me:

Return String.Equals(name, Me.Name) ' differentiate field from local