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