Sonunda açık 2. sorunuz hakkında kimsenin yorum yaptığını görmedim: "2: VB.NET vakası bir şekilde kodla yapabileceklerimi sınırlandırıyorsa, bu C #'a geçmeyi düşünmem için yeterince ikna edici mi?"
C # 'nin programcının programcının seçeneklerini sınırlamak yerine programcının seçmesine izin verdiği daha fazla seçenek yaklaşımını tercih ederim. C # 'i çok tercih ederim, ancak tek başına büyük / küçük harf duyarlılığı için, sadece büyük / küçük harfe duyarlı olduğu için bir dili öğrenmeye yakın olduğunu bile düşünmem. tüm özellikler önemli ve hem C # hem de VB.NET'in avantajlarına baktığımda, kesinlikle C # tercih ediyorum. ama size gerçek dengeli bir bakış açısı vereceğim, evet önyargılı, çünkü bir tercihim var, ancak C # 'ın dezavantajları konusunda da dürüst olacağım.
Öncelikle, her iki dilin de avantajları ve dezavantajları vardır. Bir dilde yapabileceğiniz, diğerinde yapılamayan farklılıklar, şükürler olsun ki Microsoft her iki dili de geliştiriyor ve her iki dile karşı da adil olmayan bir taraf tutmuyor gibi görünüyor.
C # ilk çıktığında, VB'nin C # 'da sevdiğim yöntemlerden önce koyabileceğiniz XML yorumları yoktu. VB.NET'te bundan nefret ediyordum. ancak yıllar içinde bir dilde olmayan birçok özelliğin diğerine eklendiğini gördüm. (MS geliştiricilerinden oluşan aynı ekip hem C # hem de VB geliştirir, bu nedenle özelliklerin oldukça benzer hale gelmesi mantıklıdır.)
ancak VB'nin sahip olmadığı C # 'ı sordunuz. işte hemen aklıma gelenler:
1: C # daha özlüdür ve daha az yazı yazmayı gerektirir .. BİRÇOK şekilde! Hatta tam tersi iddia yapıldığında, VB'nin yazmayı kurtardığı aptalca bir konuşma gördüm. ama lütfen size her iki dili de kullandıklarını ve ikisi tarafından da nadiren kullanılmadığını söyleyen insanları dinleyin. hem C # kullanıyorum veVB, C # evde sevdiğim için (ve işte C # ile çalıştığımda) ve daha yeni iş taleplerim C # değil VB kullanmamı talep ediyor. bu yüzden şimdi VB'yi daha sık kullanıyorum (şimdi yaklaşık 10 aydır), ancak kişisel ifademde daha çok C # tercih ediyorum ve gerçek yazım açısından VB önemli ölçüde daha fazla yazıyor. Aslında birinin VB'nin daha özlü olduğunu söylemeye çalıştığı okuduğum bir örnek, with'de uzun bir değişken olan bir 'with ...' örneği vermekti, bu nedenle VB'de sadece '.property' kullanabilirsiniz. VB'nin daha az yazıya ihtiyacı olduğunu iddia etmek aptallıktır. VB'nin daha kısa olduğu birkaç şey (ve sadece bu örnek değil) vardır, ancak gerçek uygulamada C # daha kısa olduğunda birçok kez vardır.
ancak C # 'nın daha kısa olduğuna inanmamın en büyük nedeni, VB'nin ayrıntılı "IF / THEN" ifadeleridir. ifadeler ortaksa. C # 'da yazılacak' sonra 'kelimesi yoktur! :) ayrıca tüm 'end ...' ifadeleri, c # 'da genellikle sadece bir kapatma ayracı olan'} 'yazmayı alır. Bazı kişilerin VB.NET'teki bu daha fazla ayrıntıların VB için bir avantaj olduğunu iddia ettiğini okudum, çünkü birkaç kapanış blok ifadesi / sembolü iç içe geçebilir ve birbirinin hemen yanında bitebilir, ancak kesinlikle katılmıyorum. Bir kişi bir programı C # veya VB ile başka bir programcıya göre neredeyse her zaman daha iyi yazabilir çünkü bir sonraki kod revizyonu daha iyi tasarlanabilir. bu, 'C #' da kafa karıştırıcı çok sayıda kapatma parantezi 'için geçerlidir, artı iç içe geçmiş blokların tümü birden fazla iç içe geçmiş IF'ler gibi aynı türdeyse, VB, C #' da olduğu gibi aynı sorunu yaşar. bu VB'de bir avantaj değildir. bu durum tam olarak neden kapanış sembolümün veya kapanış cümlenin her iki dilde ne ile birlikte gittiğini yorumlamayı seviyorum. evet, bunu yapmak daha ayrıntılıdır, ancak her iki dilde de açık olma seçeneğiniz vardır, bu da yargılamaya dayalı, duruma özgü özel durumlarda önemlidir. bence kod netliği oldukça önemli.
2: VB'nin çok satırlı açıklamaları yoktur. VB ile çalışırken umursamadım. sonra birkaç C-tarzı dile gittim. şimdi çoğunlukla işte VB.NET kullanıyorum ve onları özlüyorum. bu sadece uygun bulduğunuz ve sonra kaybetmeniz gereken bir şey. :(
3: VB'ler 'andalso' ve 'orelse', C # 'da basitçe' && 've' || 'olduğunda tüm bunları yazmak oldukça can sıkıcıdır. yine, daha az yazarak. bu hem VB hem de C # kodumda nadir değildir. herhangi bir şey varsa, işlevsellik açısından 'OR' ile 'OrElse' genellikle önemli değildir, ancak 'OrElse' bilgisayar için daha hızlıdır, bu nedenle bir programcı VB'de sadece 'Or' ve 'And' kullanırsa, o zaman için daha az optimal kod üretir. kodun netliğini seven biri. "Veya", "OrElse" den çok daha kolaydır.
4: C # kod yerleşiminde daha fazla esneklik. bir satır uzun olduğunda ve onu bir sonraki satıra kaydırmak istediğinizde, VB.NET'in kodumu 'kontrol etmekten' nefret ediyorum. C # bunu biraz yapar, ancak bunu C # 'da daha kullanışlı buluyorum, burada VB'de çok daha kontrol edici. ancak bu, dilin kendisinden ziyade daha çok VB.NET IDE ve C # IDE'dir. ama IDE farklılıkları olmayan dil özelliklerini mi yoksa tamamen mi istediğinizi bilmiyorum.
5: gerçekten özlediğim bir şey, C # 'da yeni bir kod bloğu oluşturmak, bir yöntemde çok şey olabilir ve çok küçük bir kod bloğunda bir değişken bildirmek istiyorum, ancak bu değişkeni bu bloğun dışında bildirmek istemiyorum tüm yöntem. C # 'da' {'ile yeni bir blok oluşturabilir ve onu'} 'ile bitirebiliriz. VB'nin böyle bir özelliği yoktur, ancak en yakın eşleşmesi koşulsuz bir 'If True Then' ve 'End If' bloğudur. (2 karakterli C # ve 18 karakterli VB.NET eşdeğerine tekrar dikkat edin ... VB'de daha fazla yazarak.)
6: öz Arttırma ve eksiltme operatörleri: ++ ve - gibi myVariable++
ya ++myVariable
veya eşdeğer eksiltme sürümleri. bu çok kullanışlı oluyor ... bazen. İşte C # 'ı çok özlediğimde gerçek bir kod örneği:
// 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
Ve sadece C # kurallarının olduğu ÇOK iyi bir örnek vermek gerekirse, bu son zamanlarda kişisel olarak yazdığım kodlardan daha fazlası:
// 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
Belki de bu, C # 'nın daha özlü olduğunun enuf kanıtıdır. Ancak tüm programcılar özlü olmaktan hoşlanmaz. Bazıları "eğer a <b o zaman ..." okumayı tercih ediyor çünkü bu onların insan dili için daha doğal. Ve bu gayet iyi. Tercihler gayet iyi. Benim için el çabası değer verdiğim bir faktördür ve herkesin tercih ettiği herhangi bir sembolle düşünmeye alışabileceğini düşünüyorum, çünkü "eğer" ve "o zaman" bir alfabenin sembolleri ve C # 's "if (koşul) ifadesi;" sözdizimi de sembollerdir. biri programcı olmayanın sözdizimine diğerinden daha yakındır. özlü olanı tercih ederim.
Ayrıca, onu bir dizeden ziyade bir karakter değişmezi yapmak için VB'de karakter değişmezlerinden sonra 'c' kullanmanın can sıkıcı olduğunu düşünüyorum. C # 'ın bu konudaki özlülüğünü daha çok seviyorum. bir yöntem bir karakter değişmezi gerektirdiğinde, bir karakter uzunluğunda bir dize olmayan bir karakter sağlamanız gerekir, bu nedenle bazen ":"c
C # 'da olduğu halde VB'de kullanmaya zorlanırsınız ':'
. bence bu çok iyi bir şey.
Adil olmak gerekirse, ben gibi, yöntem çağrıları sonrasında boş parantez koymak zorunda değil gibi VB ister avantajları vardır diyecekler Dim nameUpper$ = name.ToUpperInvariant
C # boş parantez gerektiriyor burada: string nameUpper = name.ToUpperInvariant()
. : ya da bunu kırparak gibi o iki katına Dim nameUpper$ = name.Trim.ToUpperInvariant
vs string nameUpper = name.Trim().ToUpperInvariant()
. VB'nin $
yukarıda C # 'ın bu kısayollara sahip olmadığı' As String 'ı karartmak için nasıl kullandığımı kısa bir şekilde kullanmasını seviyorum . VB, String, Integer, Long, Decimal, Single ve Double türleri için bu kısayollara sahiptir, ancak dezavantajı daha az nettir, bu yüzden dikkatli kullanıyorum. ancak yine de kısa kodu tercih ederim.
Eh, bu tecrübeli programcıdan sadece birkaç yorum ve düşündüğüm gibi, bu benim C # ile VB arasındaki programlama 'tanıklığı'. bence her ikisi de güzel diller tho. ama evet, hala daha çok C # tercih ediyorum.
ps Hayatımın çoğunu programlamayı planladığım için, en verimli klavyeyi kullanarak yazmayı yeniden öğrendim: Dvorak klavye, bir Qwerty klavyeye göre İngilizce yazmak için yaklaşık üçte bir çaba harcıyor. yukarı bak. belki siz de geçmek isteyebilirsiniz. ;) yazmamı% 67 kolaylaştırdı! :) Herkesi kalıpların dışında düşünmeye ve işinizde daha iyi verimliliği değerlendirmeye teşvik ediyorum. Dvorak Basitleştirilmiş Klavye Düzeni ve C # bunu benim için yaptı. :)
PSS i, Qwerty klavye düzeni ve VB ile Empirial ölçümlerin aksine Dvorak ve C # metrik ile karşılaştırılır. Dvorak, metrik ve C # sadece 'temizdir'. AMA VB gerçekten çok geride değil. Ancak eski VB6 kodu ve .NET öncesi kod ile geriye dönük uyumlu olma ihtiyacından muzdariptir, örneğin 'Or' vs 'OrElse' ve 'IIF ()' gibi.
Dikkatle bitiriyorum. Lütfen neden bahsettiklerini gerçekten bilmeyen insanları dinlemek konusunda daha ihtiyatlı olun. Hem VB hem de C # aleyhindeki tüm eksilerin yarısı değilartık herhangi bir sorun var ve insanlar hala dilde gerçekten dezavantajların ne olduğu konusunda cahil olduklarını söylüyorlar. Aklıma gelen en iyi örnek, VB'de üçlü kesme işareti veya C #'da üçlü eğik çizgi açıklama sembolleri kullanan yöntemler için XML yorumlarıdır. Ama lütfen bir kişinin cehaletten mi yoksa deneyimden mi konuştuğunu kendiniz ayırt edin. Kişisel tanıklık, gerçek deneyimlerinden bildikleri anlamına gelir. Ve birisinin bu konuda çok fazla deneyimi olduğunda, kulaklarınızı canlandırın. Hem C # hem de VB'de 10 yıldan fazla deneyime sahibim. Ve şuna kadar iniyor: her ikisi de (çok) iyi diller. Ve çoğu fark, kodu okuduktan sonraki 5 dakika içinde hemen görebilirsiniz. Ama evet, diğer özelliklerin bir dezavantaj bulması yıllar alabilir. Ve farkında olduğum bir dezavantaj (C # 'de), yapabilirim Hatta yararlı olacağı gerçek bir yaşam durumu düşünün. Yani belki de sonuçta bir handikap değildir.
Mutlu kodlamalar!