Я не бачив, щоб хтось коментував ваше явне 2-е запитання в кінці: "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 був більш стислим, наводив приклад "з ..." з довгою змінною в с, тому в VB ви можете просто використовувати ".property". це дурість стверджувати, що VB потрібно менше друкувати. Є кілька речей (і не лише цей приклад), де VB коротший, але набагато більше разів, коли C # більш стислий, в реальній практиці.
але найбільша причина, на яку я вважаю, C # є більш стислою, - це багатослівний вислів VB "ЯК / ТО". якщо твердження є загальними. в C # немає слово "тоді" набрати! :) також усі "закінчення ..." заяви набирають текст, який у c #, як правило, є лише одним заключним дужкою "}". Я читав, що деякі люди стверджують, що це більше багатослівність у VB.NET є перевагою для VB, оскільки декілька висловлювань / символів закритого блоку можуть вкладатись і закінчуватися безпосередньо поруч, але я зовсім не згоден. людина майже завжди може написати програму краще в C # або VB, ніж інший програміст, оскільки наступна редакція коду могла бути розроблена краще. це стосується "заплутаного численних дужок закриття в C #" плюс, якщо вкладені блоки є одного типу, як кілька вкладених IF, тоді VB страждає від тієї ж проблеми, що і в C #. це не є перевагою у VB. саме ця ситуація саме тому мені подобається коментувати те, що стосується мого символу завершення чи заключного виступу на обох мовах. так, це потрібно більш багатослівно, але в будь-якій мові у вас є можливість бути чітким, що важливо в судженнях, конкретних ситуаційних ситуаціях. Я думаю, що чіткість коду є досить важливою.
2: VB не має багаторядкових коментарів. коли я працював з VB, я не проти. тоді я перейшов до декількох мов стилю С. зараз я повертаюсь здебільшого за допомогою VB.NET на роботі, і я їх сумую. це просто те, що вам здається зручним, а потім доведеться втратити. :(
3: "andalso" та "orelse" VB - це досить прикро набирати все, що в C # це просто "&&" та "||". знову ж таки, менше набирайте текст. це не рідкість у моєму коді як у VB, так і в C #. якщо що-небудь, для функціональності 'OR' vs '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 True" та "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 тоді ...", оскільки це природніше для їх людської мови. І це просто чудово. Переваги прекрасні. Для мене зусилля рук - це значення фактора, і я думаю, що кожен може звикнути думати про будь-які символи, які їм подобаються, бо "якщо" і "тоді" - це символи алфавіту, а C # 's "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 # vs VB. обидва є гарними мовами, на мій погляд. але так, я все ще віддаю перевагу C #.
ps Оскільки я планую програмувати протягом більшої частини свого життя, я навіть навчився набирати текст, використовуючи найефективнішу клавіатуру: клавіатуру Dvorak, яка вимагає приблизно 1/3 зусиль для введення англійської мови, ніж на клавіатурі Qwerty. подивіться. можливо, ви також можете переключитися. ;) це полегшило моє введення на 67%! :) Я закликаю когось задуматися поза межами та оцінити кращу ефективність у вашій роботі. Спрощена розкладка клавіатури Dvorak і C # зробили це для мене. :)
PSS я би порівняв метрику Дворака і С # на метрику на відміну від розкладки клавіатури Qwerty, а VB - з вимірюванням Empirial. Дворак, метрика та C # просто "чисті". АЛЕ ВБ не дуже відстає. Але це страждає від необхідності бути зворотним сумісним зі старим кодом VB6 та попереднім кодом .NET, як-от "Або" проти "OrElse" та "IIF ()".
Закінчую обережно. Будь ласка, будьте більш обережні, щоб слухати людей, які насправді не знають, про що говорять. Половина всіх мінусів проти VB та C # не єбудь-яке питання більше, і люди все ще публікують про них, не знаючи про те, які недоліки дійсно все ще існують у мові. Найкращий приклад, про який я можу придумати, - це коментарі XML для методів, що використовують потрійний апостроф у VB або символи коментування потрійної косої риски в C #. Але, будь ласка, розпізнайте для себе, чи говорить людина через незнання чи досвід. Особисті свідчення означають, що вони знають з реального досвіду. А після того, як хтось має багато досвіду в цьому, тоді заграйте у вуха. Я маю понад 10-річний досвід роботи як в C #, так і в VB. І це зводиться до цього: обидва є (дуже) гарними мовами. І більшість відмінностей ви можете побачити відразу протягом 5 хвилин після читання коду. Але так, інші функції можуть зайняти роки, щоб знайти гандикап. І один гандикап, про який я знаю (в C #), я можу " t навіть не думати про реальну життєву ситуацію, де це було б корисно. Тож, мабуть, це не гандикап.
Щасливого кодування!