Nie widziałem nikogo, kto skomentuje twoje wyraźne drugie pytanie na końcu: „2: czy jest to wystarczająco przekonujące, bym rozważał przejście na C #, jeśli przypadek VB.NET ogranicza w jakiś sposób to, co mogę zrobić z kodem?”
Wolę podejście oparte na większej liczbie opcji, ponieważ C # pozwala programiście zdecydować, czy niż ograniczanie opcji programisty. Zdecydowanie wolę C #, ale ze względu na wielkość liter nie myślę nawet, że jest blisko nauki języka tylko dlatego, że rozróżnia wielkość liter. wszystkie funkcje mają znaczenie, a kiedy patrzę na zalety obu języków C # i VB.NET, bardzo wolę C #. ale dam ci prawdziwie zrównoważoną perspektywę, stronniczą tak, ponieważ mam preferencje, ale będę też szczery co do wad języka C #.
po pierwsze, oba języki mają zalety i wady. różnice, które można zrobić w jednym języku, których nie można zrobić w drugim, maleją, ponieważ na szczęście Microsoft ulepsza oba języki i wydaje się, że nie wykazują niesprawiedliwej stronniczości w stosunku do żadnego z nich.
kiedy C # pojawił się po raz pierwszy, VB nie miał swoich komentarzy XML, które można by umieścić przed metodami, które uwielbiałem w C #. Nienawidziłem tego w VB.NET. ale widziałem przez lata, że wiele funkcji, które nie są w jednym języku, zostało dodanych do drugiego. (ten sam zespół programistów MS opracowuje zarówno C #, jak i VB, więc ma sens, aby funkcje stały się dość podobne.)
ale zapytałeś, co ma C #, czego VB nie ma. oto kilka, które przychodzą mi do głowy od razu:
1: C # jest bardziej zwięzły i wymaga mniej pisania ... na WIELE sposobów! Widziałem nawet głupotę mówiącą, gdy jest przeciwne twierdzenie, że VB oszczędza pisania. ale proszę, słuchaj ludzi, którzy mówią ci, że używają obu języków i żaden z nich nie jest przez nich rzadko używany. używam zarówno C # iVB, C # w domu, ponieważ mi się podoba (i kiedy pracuję z C # w pracy), oraz moje nowsze prośby o pracę, w których używam VB, a nie C #. więc teraz coraz częściej używam VB (od około 10 miesięcy), ale w moim osobistym świadectwie zdecydowanie wolę C #, a jeśli chodzi o rzeczywiste pisanie, VB jest znacznie bardziej typowym. jeden przykład, który przeczytałem, gdzie ktoś faktycznie próbował powiedzieć VB był bardziej zwięzły, podał przykład „with…” z długą zmienną w with, więc w VB możesz po prostu użyć „.property”. to jest głupota w twierdzeniu, że VB wymaga mniej pisania. jest kilka rzeczy (i nie tylko w tym przykładzie), w których język VB jest krótszy, ale w praktyce znacznie częściej, gdy C # jest bardziej zwięzły.
ale największym powodem, dla którego uważam, że C # jest bardziej zwięzły, są szczegółowe instrukcje VB „IF / THEN”. jeśli stwierdzenia są wspólne. w C # nie ma słowa „to” do wpisania! :) również wszystkie instrukcje „end ...” wymagają wpisania, co w języku c # jest zwykle tylko jednym nawiasem zamykającym „}”. Czytałem, że niektórzy twierdzą, że ta większa rozwlekłość w VB.NET jest zaletą VB, ponieważ kilka zamykających instrukcji blokowych / symboli może być zagnieżdżonych i kończyć się bezpośrednio obok siebie, ale zupełnie się z tym nie zgadzam. prawie zawsze można napisać program lepiej w języku C # lub VB niż inny programista, ponieważ następna wersja kodu mogłaby być lepiej zaprojektowana. dotyczy to „mylących wielu nawiasów zamykających w C #” oraz jeśli zagnieżdżone bloki są tego samego typu, co kilka zagnieżdżonych IF, wówczas VB ma ten sam problem, co w C #. nie jest to korzystne w VB. Właśnie ta sytuacja jest powodem, dla którego lubię komentować, co oznacza mój symbol zamknięcia lub stwierdzenie końcowe w obu językach. tak, jest to bardziej rozwlekłe, ale w każdym języku możesz wyrazić się jasno, co jest ważne w przypadku konkretnych sytuacji opartych na osądzie. myślę, że przejrzystość kodu jest dość ważna.
2: VB nie ma komentarzy wieloliniowych. kiedy pracowałem z VB, nie przeszkadzało mi to. potem przeszedłem do kilku języków w stylu C. teraz wróciłem głównie do korzystania z VB.NET w pracy i tęsknię za nimi. to po prostu coś, co uważasz za wygodne, a potem musisz stracić. :(
3: „andalso” i „orelse” w języku VB jest raczej irytujące, gdy wpisuje się to wszystko w C # to po prostu „&&” i „||”. znowu mniej pisania. nie jest to rzadkie w moim kodzie zarówno w języku VB, jak i C #. jeśli cokolwiek, ze względu na funkcjonalność, „OR” kontra „OrElse” zwykle nie ma znaczenia, z wyjątkiem tego, że „OrElse” jest szybsze dla komputera, więc jeśli programista używa po prostu „Or” i „And” w VB, to tworzy mniej optymalny kod dla ktoś, kto lubi przejrzystość kodu. „Or” jest o wiele łatwiejsze do przejrzenia niż „OrElse”.
4: większa elastyczność w umieszczaniu kodu w C #. kiedy linia jest długa i chcesz ją zawinąć w następną, nienawidzę „kontrolowania” przez VB.NET ponownej regulacji mojego kodu. C # robi to trochę, ale uważam, że jest bardziej przydatny w C #, podczas gdy w VB jest znacznie bardziej kontrolujący. ale jest to bardziej VB.NET IDE vs C # IDE, a nie sam język. ale nie wiem, czy chcesz mieć obie, czy tylko funkcje językowe bez różnic IDE.
5: jedyną rzeczą, za którą naprawdę tęsknię, jest po prostu utworzenie nowego bloku kodu w C #, w metodzie może wiele się dziać i chcę zadeklarować zmienną w bardzo małym bloku kodu, ale nie zadeklarować tej zmiennej poza tym blokiem w całą metodę. w C # możemy po prostu utworzyć nowy blok za pomocą „{” i zakończyć go „}”. VB nie ma takiej funkcji, ale najbliższym dopasowaniem jest bezwarunkowy blok „Jeśli prawda to” i „Zakończ, jeśli”. (zwróć uwagę na 2-znakowy odpowiednik C # w porównaniu z 18-znakowym odpowiednikiem VB.NET ... więcej pisania w VB.)
6: operatory samoinkrementacji i dekrementacji: ++ i - jak w myVariable++
lub ++myVariable
lub równoważne wersje dekrementacji. jest to bardzo przydatne ... czasami. oto przykład rzeczywistego kodu, kiedy bardzo brakowało mi 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
I żeby dać BARDZO dobry przykład, gdzie reguły C #, oto więcej kodu, który osobiście ostatnio napisałem:
// 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
Być może jest to wystarczający dowód, że C # jest bardziej zwięzły. Ale nie wszyscy programiści lubią zwięzłość. Niektórzy wolą czytać „if a <b then…”, ponieważ jest to bardziej naturalne dla ich ludzkiego języka. I to jest w porządku. Preferencje są w porządku. Dla mnie wysiłek rąk jest wartością i i myślę, że każdy może przyzwyczaić się do myślenia dowolnymi symbolami, ponieważ „jeśli” i „to” są symbolami alfabetu, a instrukcja „if (warunek)” w języku C #; składnia to też symbole. jeden jest po prostu bliższy składni nieprogramisty niż drugi. wolę zwięzły.
Myślę też, że potrzeba użycia „c” po literałach znakowych w VB, aby uczynić go literałem znakowym, a nie ciągiem, jest denerwująca. O wiele bardziej podoba mi się zwięzłość języka C #. gdy metoda wymaga literału znakowego, musisz podać znak, a nie ciąg o jednej długości znaku, więc czasami musisz użyć ":"c
w języku VB, podczas gdy w C # tak jest ':'
. Myślę, że to jest jednak chwytanie nitów.
Aby być sprawiedliwym, muszę powiedzieć, istnieją zalety lubię VB jak nie trzeba stawiać pustych nawiasów po wywołań metod, jak Dim nameUpper$ = name.ToUpperInvariant
gdzie C # wymaga pustych nawiasów: string nameUpper = name.ToUpperInvariant()
. lub podwoić że jak przycinanie go zbyt: Dim nameUpper$ = name.Trim.ToUpperInvariant
vs string nameUpper = name.Trim().ToUpperInvariant()
. Podoba mi się zwięzłe użycie VB tego, jak właśnie użyłem$
powyżej, aby przyciemnić to `` As String '', gdzie C # nie ma tych skrótów. VB ma te skróty dla typów String, Integer, Long, Decimal, Single i Double, ale wadą jest to, że jest mniej jasny, więc używam go ostrożnie. niemniej jednak wolę zwięzły kod.
Cóż, to tylko kilka dziwek od tego doświadczonego programisty i jak uważam, to jest moje „świadectwo” programowania C # vs VB. moim zdaniem oba są fajnymi językami. ale tak, nadal wolę C #.
ps Ponieważ planuję programować przez większość swojego życia, nawet ponownie nauczyłem się pisać przy użyciu najbardziej wydajnej klawiatury: klawiatury Dvorak, której pisanie po angielsku zajmuje około 1/3 wysiłku niż na klawiaturze Qwerty. sprawdź to. może też zechcesz się przełączyć. ;) Ułatwiło mi to pisanie o 67%! :) Zachęcam każdego do nieszablonowego myślenia i oceny lepszej efektywności pracy. Uproszczony układ klawiatury Dvoraka i C # zrobiły to za mnie. :)
PSS porównałbym Dvorak i C # do metryki, w przeciwieństwie do układu klawiatury Qwerty i VB do pomiarów Empirial. Dvorak, metric i C # są po prostu „czyste”. ALE VB nie jest daleko w tyle. Ale cierpi z powodu konieczności zachowania kompatybilności wstecznej ze starym kodem VB6 i kodem pre .NET, takim jak „Or” vs „OrElse” i „IIF ()”.
Kończę ostrożnie. Prosimy, bądź ostrożniejszy niż słuchanie ludzi, którzy tak naprawdę nie wiedzą, o czym mówią. Połowa wszystkich wad przeciwko VB i C # to nie jestjakikolwiek problem, a ludzie wciąż piszą, że nie wiedzą, jakie wady naprawdę nadal istnieją w języku. Najlepszym przykładem, jaki przychodzi mi do głowy, są komentarze XML dla metod wykorzystujących potrójny apostrof w VB lub symbole komentarzy z potrójnym ukośnikiem w C #. Ale proszę, zastanów się, czy dana osoba mówi z powodu ignorancji, czy z doświadczenia. Osobiste świadectwo oznacza, że wiedzą z prawdziwego doświadczenia. A kiedy ktoś ma w tym duże doświadczenie, nadstaw uszy. Mam ponad 10 lat doświadczenia w językach C # i VB. Sprowadza się to do tego: oba są (bardzo) dobrymi językami. Większość różnic widać od razu w ciągu 5 minut od przeczytania kodu. Ale tak, w przypadku innych funkcji znalezienie upośledzenia może zająć lata. I jeden handicap, którego jestem świadomy (w C #), mogę ” Nie myśl nawet o prawdziwej sytuacji życiowej, w której byłoby to przydatne. Więc może w końcu to nie jest przeszkoda.
Miłego kodowania!