Tôi chưa thấy ai bình luận về câu hỏi thứ 2 rõ ràng của bạn ở cuối: "2: điều này có đủ thuyết phục để tôi cân nhắc chuyển sang C # nếu trường hợp VB.NET bằng cách nào đó hạn chế những gì tôi có thể làm với mã không?"
tôi thích cách tiếp cận tùy chọn hơn mà C # cho phép lập trình viên lựa chọn hơn là giới hạn các tùy chọn của lập trình viên. tôi rất thích C #, nhưng chỉ riêng về phân biệt chữ hoa chữ thường, tôi thậm chí sẽ không nghĩ rằng nó gần giống với việc học một ngôn ngữ chỉ vì nó phân biệt chữ hoa chữ thường. tất cả các tính năng đều là vấn đề và khi tôi xem xét ưu điểm của cả C # và VB.NET, tôi rất thích C #. nhưng tôi sẽ cung cấp cho bạn một quan điểm cân bằng thực sự, thiên vị có, bởi vì tôi có sở thích, nhưng tôi cũng sẽ thành thật về những nhược điểm của C #.
trước hết, cả hai ngôn ngữ đều có ưu điểm và nhược điểm. những khác biệt mà bạn có thể thực hiện ở một ngôn ngữ mà không thể thực hiện được ở ngôn ngữ kia đang giảm dần vì, may mắn thay, Microsoft đang cải thiện cả hai ngôn ngữ và chúng dường như không thể hiện sự phân biệt bất công đối với cả hai ngôn ngữ.
khi C # ra mắt lần đầu, VB không có các chú thích XML của nó mà bạn có thể đặt trước các phương thức mà tôi yêu thích trong C #. tôi ghét điều đó trong VB.NET. nhưng tôi đã thấy trong nhiều năm qua, nhiều tính năng không có trong ngôn ngữ này được thêm vào ngôn ngữ khác. (cùng một nhóm các nhà phát triển MS phát triển cả C # và VB, do đó, có nghĩa là các tính năng phải trở nên khá giống nhau.)
nhưng bạn yêu cầu những gì C # có mà VB thì không. đây là một số tôi có thể nghĩ đến ngay lập tức:
1: C # ngắn gọn hơn và ít nhập hơn .. theo NHIỀU cách! Tôi thậm chí đã thấy sự ngu ngốc khi nói khi yêu cầu ngược lại được đưa ra, rằng VB tiết kiệm việc nhập. nhưng hãy lắng nghe những người nói với bạn rằng họ sử dụng cả hai ngôn ngữ và cả hai ngôn ngữ hiếm khi được họ sử dụng. tôi sử dụng cả C # vàVB, C # ở nhà vì tôi thích nó (và khi tôi làm việc với C # tại nơi làm việc), và yêu cầu công việc gần đây hơn của tôi rằng tôi sử dụng VB chứ không phải C #. vì vậy tôi đang sử dụng VB thường xuyên hơn bây giờ (khoảng 10 tháng nay), nhưng theo lời khai cá nhân của tôi, tôi thích C # hơn, và về cách gõ thực tế, VB gõ nhiều hơn đáng kể. một ví dụ mà tôi đã đọc trong đó ai đó thực sự cố gắng nói VB ngắn gọn hơn, đã đưa ra một ví dụ 'with ...' với một biến dài trong with, vì vậy trong VB, bạn chỉ có thể sử dụng '.property'. đây là sự ngu ngốc khi cho rằng VB cần ít đánh máy hơn. Có một số điều (và không chỉ ví dụ này) trong đó VB ngắn hơn, nhưng nhiều khi C # ngắn gọn hơn, trong thực tế.
nhưng lý do lớn nhất tôi tin rằng C # ngắn gọn hơn, là các câu lệnh dài dòng "IF / THEN" của VB. câu lệnh if là phổ biến. trong C # không có từ 'then' để gõ! :) cũng như tất cả các câu lệnh 'end ...' mà trong c #, thường chỉ là một dấu ngoặc nhọn đóng '}'. Tôi đã đọc rằng một số người cho rằng sự dài dòng hơn này trong VB.NET là một lợi thế của VB vì một số câu lệnh / ký hiệu khối đóng có thể được lồng vào nhau và kết thúc ngay bên cạnh nhau, nhưng tôi hoàn toàn không đồng ý. một người hầu như luôn có thể viết một chương trình bằng C # hoặc VB tốt hơn một lập trình viên khác bởi vì bản sửa đổi mã tiếp theo có thể được thiết kế tốt hơn. điều này áp dụng cho 'vô số dấu ngoặc nhọn đóng trong C #' cộng với nếu các khối lồng nhau đều cùng loại như một số IF lồng nhau thì VB gặp phải vấn đề tương tự như trong C #. điều này không có lợi trong VB. tình huống này chính xác là lý do tại sao tôi muốn nhận xét biểu tượng kết thúc hoặc câu lệnh kết thúc của tôi đi kèm với cả hai ngôn ngữ. vâng, điều này là dài dòng hơn để làm, nhưng bằng cả hai ngôn ngữ, bạn có tùy chọn để rõ ràng, điều này quan trọng trong các trường hợp cụ thể dựa trên phán đoán, tình huống. tôi nghĩ rằng mã rõ ràng là khá quan trọng.
2: VB không có ý nhiều dòng. khi tôi làm việc với VB, tôi không bận tâm. sau đó tôi đã chuyển sang một vài ngôn ngữ kiểu C. bây giờ tôi trở lại chủ yếu sử dụng VB.NET tại nơi làm việc và tôi nhớ chúng. nó chỉ là một cái gì đó bạn thấy thuận tiện, và sau đó phải mất. :(
3: 'andalso' và 'orelse' của VB khá khó chịu khi gõ tất cả những thứ đó khi trong C # nó chỉ đơn giản là '&&' và '||'. một lần nữa, gõ ít hơn. điều này không hiếm trong mã của tôi ở cả VB và C #. nếu có, đối với chức năng, 'OR' vs 'OrElse' thường không quan trọng ngoại trừ 'OrElse' nhanh hơn cho máy tính, vì vậy nếu một lập trình viên chỉ sử dụng 'Or' và 'And' trong VB, thì nó tạo ra mã ít tối ưu hơn cho một người thích sự rõ ràng của mã. 'Hoặc' dễ đọc hơn nhiều so với 'OrElse'.
4: linh hoạt hơn trong việc đặt mã trong C #. khi một dòng dài và bạn muốn đặt nó ở dòng tiếp theo, tôi ghét việc VB.NET 'kiểm soát' đọc mã của tôi. C # làm điều đó một chút, nhưng tôi thấy nó hữu ích hơn trong C #, trong đó trong VB, nó kiểm soát nhiều hơn. nhưng đây là VB.NET IDE so với C # IDE hơn là chính ngôn ngữ. nhưng tôi không biết liệu bạn có muốn cả hai hay chỉ đơn thuần là các tính năng ngôn ngữ mà không có sự khác biệt về IDE.
5: một điều tôi thực sự bỏ lỡ là chỉ tạo một khối mã mới trong C #, tôi có thể có nhiều điều xảy ra trong một phương thức và tôi muốn khai báo một biến trong một khối mã rất nhỏ nhưng không có biến đó được khai báo bên ngoài khối đó trong toàn bộ phương pháp. trong C #, chúng ta chỉ có thể tạo một khối mới bằng '{' và kết thúc bằng '}'. VB không có tính năng như vậy, nhưng đối sánh gần nhất của nó là khối 'If True Then' và 'End If' vô điều kiện. (lưu ý 2 ký tự C # và 18 ký tự VB.NET tương đương một lần nữa ... gõ nhiều hơn trong VB.)
6: toán tử tăng và giảm tự: ++ và - như trong myVariable++
hoặc ++myVariable
hoặc các phiên bản giảm dần tương đương. điều này rất hữu ích ... đôi khi. đây là một ví dụ về mã thực tế khi tôi đã bỏ lỡ C # rất nhiều:
// 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
Và chỉ để đưa ra một ví dụ RẤT tốt về quy tắc C #, đây là mã khác mà cá nhân tôi đã viết gần đây:
// 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ó lẽ đây là bằng chứng cho thấy C # ngắn gọn hơn. Nhưng không phải tất cả các lập trình viên đều thích sự ngắn gọn. Một số thích đọc "if a <b then ..." vì nó tự nhiên hơn với ngôn ngữ của con người. Và điều đó thật tốt. Sở thích là tốt. Đối với tôi, nỗ lực của đôi tay là một yếu tố tôi coi trọng và tôi nghĩ rằng bất kỳ ai cũng có thể quen với việc suy nghĩ theo bất kỳ ký hiệu nào họ thích, vì "if" và "then" là các ký hiệu của bảng chữ cái và câu lệnh "if (condition)" của C #; " cú pháp cũng là ký hiệu. một cái chỉ gần với cú pháp của người không phải lập trình hơn cái kia. tôi thích cái ngắn gọn hơn.
Tôi cũng nghĩ rằng cần phải sử dụng 'c' sau các ký tự ký tự trong VB để biến nó thành một ký tự theo nghĩa đen thay vì một chuỗi là điều khó chịu. Tôi thích sự ngắn gọn của C # với điều đó nhiều hơn nữa. khi một phương thức yêu cầu một ký tự là ký tự, bạn cần cung cấp một ký tự không phải là một chuỗi với độ dài một ký tự, vì vậy đôi khi bạn buộc phải sử dụng ":"c
trong VB trong khi trong C # thì đúng như vậy ':'
. tôi nghĩ rằng đây là nit-hái tho.
Để công bằng, tôi sẽ nói có lợi thế tôi muốn VB như không cần phải đặt dấu ngoặc trống sau khi các cuộc gọi phương pháp, giống như Dim nameUpper$ = name.ToUpperInvariant
nơi C # đòi hỏi các dấu ngoặc rỗng: string nameUpper = name.ToUpperInvariant()
. hoặc gấp đôi như cắt tỉa nó quá: Dim nameUpper$ = name.Trim.ToUpperInvariant
vs string nameUpper = name.Trim().ToUpperInvariant()
. Tôi thích cách sử dụng ngắn gọn của VB về cách tôi vừa sử dụng $
ở trên để làm mờ nó 'As String' trong đó C # không có các phím tắt đó. VB có các phím tắt đó cho các loại Chuỗi, Số nguyên, Dài, Thập phân, Đơn và Đôi, nhưng nhược điểm là nó ít rõ ràng hơn, vì vậy tôi sử dụng nó một cách thận trọng. nhưng tuy nhiên, tôi thích mã ngắn gọn hơn.
Chà, đó chỉ là một số thông tin từ lập trình viên dày dạn kinh nghiệm này, và như tôi xem xét, đây là 'lời khai' lập trình của tôi về C # vs VB. cả hai đều là ngôn ngữ tốt tho, theo ý kiến của tôi. nhưng có, tôi vẫn thích C # hơn.
ps Vì tôi dự định lập trình trong phần lớn cuộc đời mình, tôi thậm chí còn học lại cách gõ bằng bàn phím hiệu quả nhất: bàn phím Dvorak, mất khoảng 1/3 nỗ lực để gõ tiếng Anh so với bàn phím Qwerty. tìm kiếm. có lẽ bạn cũng có thể muốn chuyển đổi. ;) nó giúp tôi đánh máy dễ dàng hơn 67%! :) Tôi khuyến khích bất cứ ai suy nghĩ bên ngoài và đánh giá hiệu quả tốt hơn trong công việc của bạn. Bố cục bàn phím đơn giản hóa Dvorak và C # đã làm được điều này cho tôi. :)
PSS tôi sẽ so sánh Dvorak và C # về số liệu thay vì bố cục bàn phím Qwerty và VB với các phép đo Empirial. Dvorak, metric và C # chỉ là 'sạch'. NHƯNG VB không thực sự thua xa. Nhưng nó thực sự cần phải tương thích ngược với mã VB6 cũ và mã .NET trước, như 'Or' vs 'OrElse' và 'IIF ()'.
Tôi kết thúc với một sự thận trọng. Hãy thận trọng hơn khi lắng nghe những người không thực sự biết họ đang nói về điều gì. Một nửa của tất cả các nhược điểm chống lại cả VB và C # là khôngbất kỳ vấn đề nào nữa, và mọi người vẫn đăng bài về việc họ không biết gì về những nhược điểm thực sự vẫn tồn tại trong ngôn ngữ. Ví dụ tốt nhất mà tôi có thể nghĩ đến là nhận xét XML cho các phương pháp sử dụng dấu nháy đơn ba trong VB hoặc ký hiệu nhận xét dấu gạch chéo ba trong C #. Nhưng hãy tự mình phân biệt xem một người đang nói do thiếu hiểu biết hay do kinh nghiệm. Lời khai cá nhân có nghĩa là họ biết từ kinh nghiệm thực tế của họ. Và sau khi ai đó có nhiều kinh nghiệm trong đó, thì hãy vểnh tai lên. Tôi có hơn 10 năm kinh nghiệm trong cả C # và VB. Và nó tóm gọn lại điều này: cả hai đều là (rất) ngôn ngữ tốt. Và hầu hết sự khác biệt, bạn có thể thấy ngay lập tức trong vòng 5 phút sau khi đọc mã. Nhưng có, các tính năng khác có thể mất nhiều năm để tìm ra điểm chấp. Và một điểm chấp mà tôi biết (trong C #), tôi có thể ' tôi thậm chí không nghĩ đến một tình huống thực tế mà nó sẽ hữu ích. Vì vậy, có lẽ đó không phải là một điểm chấp.
Chúc bạn viết mã vui vẻ!