Я не видел, чтобы кто-нибудь прокомментировал ваш явный второй вопрос в конце: «2: достаточно ли это убедительно для меня, чтобы подумать о переходе на C #, если случай VB.NET каким-то образом ограничивает то, что я могу делать с кодом?»
Я предпочитаю более опционный подход, когда 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, я не возражал. затем я перешел на несколько языков в стиле C. Теперь я снова использую VB.NET на работе и скучаю по ним. это просто то, что вам удобно, а потом придется потерять. :(
3: «andalso» и «orelse» в VB довольно неприятно набирать все это, когда в C # это просто «&&» и «||». опять же меньше набора текста. это не редкость в моем коде как на VB, так и на C #. во всяком случае, для функциональности 'OR' против 'OrElse' обычно не имеет значения, за исключением того, что 'OrElse' быстрее для компьютера, поэтому, если программист просто использует 'Or' и 'And' в VB, он создает менее оптимальный код для тот, кому нравится ясность кода. «Или» гораздо легче пролистать, чем «OrElse».
4: больше гибкости в размещении кода на C #. когда строка длинная, и вы хотите перенести ее на следующую строку, я ненавижу "контролирующую" корректировку моего кода в VB.NET. C # делает это немного, но я считаю его более полезным в C #, тогда как в VB это гораздо больше контроля. но это скорее VB.NET IDE и 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 <b, то ...», потому что это более естественно для их человеческого языка. И это нормально. Предпочтения в порядке. Для меня усилие руки - это значение фактора i, и я думаю, что любой может привыкнуть думать любыми символами, которые ему нравятся, поскольку «if» и «then» - это символы алфавита, а C # - «оператор if (условие);» синтаксис тоже символы. один просто ближе к синтаксису непрограммиста, чем другой. Я предпочитаю лаконичный.
Я также думаю, что необходимость использовать '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 #.
ps Так как я планирую программировать большую часть своей жизни, я даже заново научился печатать, используя наиболее эффективную клавиатуру: клавиатуру Дворжака, которая требует примерно 1/3 усилий для набора английского языка, чем на клавиатуре Qwerty. поищи это. возможно, вы тоже захотите переключиться. ;) мне стало легче печатать на 67%! :) Я призываю всех мыслить нестандартно и оценивать эффективность своей работы. Упрощенная раскладка клавиатуры Дворжака и C # сделали это за меня. :)
PSS Я бы сравнил Dvorak и C # с метрикой, в отличие от раскладки клавиатуры Qwerty, и VB с эмпирическими измерениями. Дворжак, метрика и C # просто «чистые». НО VB не сильно отстает. Но он страдает от необходимости быть обратно совместимым со старым кодом VB6 и кодом до .NET, например, «Or» против «OrElse» и «IIF ()».
Я заканчиваю с осторожностью. Пожалуйста, будьте более осмотрительны, чем прислушивайтесь к людям, которые на самом деле не понимают, о чем они говорят. Половина всех минусов как VB, так и C # - небольше нет проблем, и люди все еще пишут о том, что они не знают, какие недостатки действительно все еще существуют в языке. Лучший пример, который я могу придумать, - это XML-комментарии для методов, использующих тройной апостроф в VB или символы комментария с тройной косой чертой в C #. Но, пожалуйста, определите для себя, говорит ли человек по незнанию или по опыту. Личное свидетельство означает, что они знают на собственном опыте. А после того, как у кого-то будет большой опыт в этом, тогда придайте уши. У меня более 10 лет опыта как в C #, так и в VB. И все сводится к следующему: оба (очень) хорошие языки. И большинство различий вы можете увидеть сразу через 5 минут после чтения кода. Но да, на поиск других функций могут уйти годы. И один недостаток, о котором я знаю (в C #), я могу ' Я даже не думаю о реальной жизненной ситуации, когда это было бы полезно. Так что, возможно, это все-таки не помеха.
Удачного кодирования!