Sự khác biệt giữa VB.NET và C# được thể hiện ở ba phần chính: cú pháp, các nguyên lý hướng đối tượng, và môi trường phát triển tích hợp Visual Studio .NET. Sự khác biệt về cú pháp liên quan đến các câu lệnh và các yếu tố ngôn ngữ. Sự khác biệt về hướng đối tượng thì khó thấy hơn, liên quan đến bản hiện thực và tính năng giữa hai ngôn ngữ. Sự khác biệt về môi trường phát triển tích hợp bao gồm những thiết lập biên dịch (là những đặc tính được thiết lập thông qua IDE, có tác dụng khác nhau tùy vào ngôn ngữ). Cũng có sự khác biệt thứ tư liên quan đến các tính năng ngôn ngữ có trong ngôn ngữ này nhưng không có trong ngôn ngữ kia.
1. Sự khác biệt về cú pháp
Sự khác biệt về cú pháp là sự khác biệt thông thường nhất mà chúng ta nghĩ đến khi so sánh hai ngôn ngữ. Sự khác biệt về cú pháp đề cập đến sự khác biệt trong từ khóa và định dạng câu lệnh được sử dụng để thực hiện các tác vụ giống nhau. Ví dụ: trong C#, câu lệnh được kết thúc bằng dấu chấm phẩy; trong VB.NET, câu lệnh được kết thúc bằng dãy ký tự chuyển dòng.
1.1 Phân biệt chữ hoa-thường
Một khác biệt chính giữa hai ngôn ngữ là C# có phân biệt chữ hoa-thường, còn VB.NET thì không. Câu lệnh dưới đây đúng trong VB.NET (tất cả đều viết thường):
Code:
system.console.writeline("hello world")
Trong C#, câu lệnh trên sẽ phát sinh lỗi. Cách viết đúng câu lệnh này trong C# như sau:
Code:
System.Console.WriteLine("hello world");
Cả C# và VB.NET đều biên dịch thành một ngôn ngữ trung gian (Intermediate Language—IL). Điều đáng nói là IL có phân biệt chữ hoa-thường, nghĩa là VB.NET phải chuyển những dòng lệnh lúc biên dịch sao cho trùng khớp dạng chữ của câu lệnh gốc ở mức IL.
Một hiệu ứng lề của việc không phân biệt chữ hoa-thường là có những lúc trình biên dịch không thể so trùng chính xác dạng chữ với khai báo gốc của một hàm, dẫn đến kết quả không chính xác. Ví dụ:
VB.NET
Code:
Class Account
Overloads Function toString(ByVal Format As String) As String
Return "My String with Format"
End Function
Overloads Overrides Function toString() As String
Return "My String"
End Function
End Class
Module App
Sub Main()
Dim acct As Object = New Account()
System.Console.WriteLine(acct.ToString())
End Sub
End Module
Trong ví dụ trên, toString không chép đè phương thức ToString trong lớp cơ sở, và phương thức toString không bao giờ được gọi. Ví dụ này cho thấy sự phức tạp của việc có một ngôn ngữ không phân biệt chữ hoa-thường trong khi tất cả đều phân biệt chữ hoa-thường.
Điều gì sẽ xảy ra nếu bạn thêm hai hàm công khai trong C# với tên giống nhau nhưng khác dạng chữ hoa-thường? VB không thể sử dụng hàm này, và báo rằng nó không thể phân giải hàm. Ví dụ, lớp Banking được viết trong C# có hai phương thức MakeDeposit và makedeposit. Bạn có thể tham chiếu DLL trong VB, và tạo một thể hiện của lớp Banking. Nhưng nếu bạn sử dụng phương thức MakeDeposit hay makedeposit, trình biên dịch sẽ không biết phải sử dụng phương thức nào. Để ngăn chặn điều này, bạn có thể yêu cầu trình biên dịch kiểm tra sự chấp thuận của Common Language Specification (CLS) bằng cách thêm dòng lệnh sau vào file AssemblyInfo.cs của dự án C#:
Code:
[assembly: System.CLSCompliant(true)]
Nếu đang sử dụng trình biên dịch C#, bạn chỉ việc thêm dòng lệnh này vào file mã nguồn sau các câu lệnh using. Sau khi thêm dòng lệnh này, trình biên dịch C# sẽ thông báo lỗi nếu hai hàm công khai trong lớp của bạn chỉ khác nhau ở dạng chữ.
1.2 Kết dòng
Câu lệnh C# có thể được tách thành nhiều dòng với CRLF và được kết thúc bằng một dấu chấm phẩy. Câu lệnh VB.NET chỉ có thể được tách bằng một ký tự tiếp dòng và được kết thúc bằng CRLF. Đoạn mã sau minh họa cho việc tách dòng trong C#:
C#.NET
Code:
// Một dòng mã trong C#.
string sName = sFirstName +
sLastName;
// Dấu chấm phẩy báo hiệu kết thúc câu lệnh.Bạn có thể tách dòng tại bất kì vị trí nào. Bạn có thể đặt mỗi từ trên một dòng riêng, thậm chí có thể thêm chú thích ở cuối mỗi đoạn. Ví dụ:
C#.NET
Code:
string
sName // biến
= // toán tử
sFirstName // tên
+ // toán tử
sLastName;
// Dấu chấm phẩy báo hiệu kết thúc câu lệnh.Bạn có thể thực hiện tương tự với các chuỗi trực kiện bằng cách đặt biểu tượng @ trước chuỗi:
C#.NET
Code:
string
sName = @"John Jacob Jingle
Hymer Smith";
Tuy nhiên, đoạn mã trên cho kết quả là một chuỗi với ký tự xuống dòng được nhúng vào.
Trong VB, để tách một dòng thành nhiều phần, bạn phải thêm một khoảng trắng và ký tự gạch dưới. Ví dụ:
VB.NET
Code:
' Một dòng trong VB.
Dim sName As String = sFirstName + _
sLastNameGiống như C#, bạn có thể tùy ý tách mỗi từ như ví dụ bên dưới. Tuy nhiên, khác với C#, việc thêm chú thích cuối mỗi đoạn là không hợp lệ.
VB.NET
Code:
' Một dòng trong VB.
Dim _
sName _
As _
String _
= _
sFirstName _
+ _
sLastNameKhác với C#, việc tách các chuỗi trực kiện thành hai dòng là không hợp lệ.
1.3 Chú thích
C# phân biệt giữa chú thích dòng và chú thích khối. Chú thích dòng sử dụng hai dấu vạch xiên “//” như sau:
C#.NET
Code:
// Đây là một chú thích.
void MakeDeposit(int Amount)
{
int _Balance; // Số dư tài khoản.
}Chú ý, trong đoạn mã trên, có một chú thích trước khai báo hàm và một chú thích sau khai báo _Balance. Khi bạn sử dụng hai dấu vạch xiên, tất cả văn bản sau hai dấu vạch này được xem như là một phần của chú thích.
Chú thích khối sử dụng một dấu vạch xiên theo sau là một dấu hoa thị (/*) để bắt đầu khối, và kết thúc khối bằng một dấu hoa thị theo sau là một dấu vạch xiên (*/). Ví dụ:
C#.NET
Code:
/*
Hàm: MakeDeposit
Tầm vực: Public
Mô tả: Tăng số dư tài khoản.
Tác giả: Alibaba
*/
public void MakeDeposit(int Amount /*chú thích 1*/,
int AmountAvail /*chú thích 2*/) {}Chú thích khối cho phép bạn viết một đoạn chú thích mà không cần đặt hai dấu vạch xiên trên mỗi dòng, nhưng nó cũng cho phép bạn chèn một chú thích bên trong một dòng mã. Chú thích khối có thể có các chú thích được nhúng bên trong, ví dụ:
C#.NET
Code:
/*
// Đây là chú thích được nhúng vào.
*/VB.NET chỉ có chú thích dòng. Các chú thích được tạo ra với câu lệnh Rem hay với dấu nháy đơn (cách này thường được sử dụng hơn). Ví dụ:
VB.NET
Code:
' Đây là một chú thích.
Rem Đây là một chú thích khác.
Sub MakeDeposit(ByVal Amount As Integer)
Dim _Balance As Integer ' Số dư tài khoản.
End SubMột hạn chế đối với các chú thích trong VB là bạn không thể chèn một chú thích vào chính giữa một dòng lệnh như có thể thực hiện với chú thích khối trong C#.