2009-06-23 39 views
7

Đây là câu hỏi về ngôn ngữ VB.NET. Vì tôi đang sử dụng nó mỗi ngày, tôi chỉ cố gắng hiểu những động cơ đằng sau một số cấu trúc của nó.Ngôn ngữ VB.NET và Không có gì: tại sao nó lại như vậy?

Tôi chỉ tìm ra rằng dòng này:

If myObject Is Nothing then 

là như đúng như cái này là:

If Nothing Is myObject Then 

kết quả tương tự. Sử dụng ildasm, chúng ta có thể thấy rằng những dòng này được dịch sang:

if myObject = null then 

if null = myObject then 

Vâng, nhưng, trong VB.NET, bạn không thể viết:

if myObject = Nothing Then 

Trình biên dịch sẽ không chấp nhận điều đó.

Mmm, với tôi, Nếu không có gì là myObject là nhiều ít rõ ràng hơn Nếu myObject = Nothing.

Tại sao các tác giả VB.NET chỉ nghĩ ngược lại? Bất kỳ gợi ý nào?

+14

Đó là để đảm bảo rằng các lập trình viên c sẽ tiếp tục ghét VB. : P –

+0

@Jon: Vui nhộn. Tôi thích nó. : D –

+0

@Jon: +1 :)! – SRO

Trả lời

25

Sự cố bạn đang gặp phải là VB.Net phân biệt hai loại so sánh đối tượng. Cụ thể là tham khảo và so sánh giá trị.

Toán tử "Is" trong VB.Net được sử dụng để so sánh tham chiếu. Điều này có thể được sử dụng khi các giá trị được đề cập là cả hai loại tham chiếu hoặc giá trị rỗng. Cố gắng so sánh các loại giá trị theo cách này sẽ dẫn đến lỗi biên dịch.

Toán tử "=" được sử dụng để so sánh Giá trị. So sánh giá trị chỉ có thể được sử dụng trên các loại xác định cặp rõ ràng =, < > trong định nghĩa lớp của chúng. Việc thực hiện bình đẳng thực tế phụ thuộc vào việc thực hiện của nhà điều hành.

C# có cách tiếp cận khác ở chỗ nó sử dụng == cho cả giá trị và so sánh tham chiếu. Được sử dụng phụ thuộc vào một vài yếu tố bao gồm loại giá trị được so sánh và việc thực hiện các phương thức nhất định nhất định.

+4

Tôi đã chờ đợi ở đây đếm ngược để bạn đến và viết một câu trả lời. :) Tôi chuẩn bị nộp hồ sơ nếu bạn trễ 10 giây. –

+0

@Mehrdad, vui vì tôi nhấn làm mới trong thời gian :) – JaredPar

4

Đây là một trong những thứ được kế thừa từ VB6 và COM. VB6 tạo sự khác biệt giữa các đối tượng kiểu tham chiếu (tức là các đối tượng) và các kiểu gốc như int. Các kiểu tham chiếu phải được tạo và gán với toán tử "Set" trong khi các kiểu gốc chỉ được sử dụng "=".

3

Vâng, trong một số trường hợp, bạn có thể viết If myObject = Nothing Then, nhưng nó sẽ không thể là một sự so sánh null:

Dim someValue As Integer 
If someValue = Nothing Then 
    ' do something ' 
End If 

Đoạn mã trên là tương đương với các nội dung sau:

Dim someValue As Integer 
If someValue = 0 Then 
    ' do something ' 
End If 

Trong trường hợp này bạn có loại giá trị có giá trị "emtpy" (0 cho số Integer, Point.Empty cho cấu trúc Point làm ví dụ). Toán tử Is thực hiện so sánh tham chiếu (kiểm tra xem các đối tượng được so sánh có giống nhau không), trong khi dấu bằng là so sánh giá trị.

+0

Có, chỉ cần thử nó: bạn có thể viết: "nếu 2 = Nothing Then", trình biên dịch chỉ là ok với điều đó. Hơn nữa, như bạn đã nói, "nếu 0 = Không có gì" luôn đúng ... Tuyệt vời, cảm ơn! – SRO

+1

Tôi nghĩ rằng đây là một phần khó hiểu của ngôn ngữ VB. Đối với người mới, không rõ là Không có nghĩa là "giá trị mặc định" cho các loại giá trị ... –

1

Việc sử dụng Is Nothing là cấu trúc quay lại thời kỳ Visual Basic cổ điển (ví dụ: 6.0 trở xuống).

Để duy trì một số khả năng tương thích (giống như cách VB6 xử lý việc đánh giá không lười biếng của câu lệnh If) điều này đã được chuyển sang VB.NET.

May mắn thay là ocdecio chỉ ra, có những peccadillos tương tự khác chưa được chuyển tiếp vào VB.NET như câu lệnh Set để gán đối tượng cho biến.

1

Một suy nghĩ khác là VB có ý định tiết lộ chi tiết hơn nếu bạn nhìn vào một số cú pháp vòng lặp và điều kiện. Một vài ví dụ:

VB:

If x==0 Then 
End If 

While 
End While 

For i = 0 to 10 Step 2 
Next i 

C#

If x==0 
{ 
} 

While 
{ 
} 

for (int i = 0; i<=10;i+2) 
{ 
} 

Xem tất cả các từ phụ trong đoạn code VB.Net? Đó là một lý do khác có thể cho sự khác biệt.

+0

Vâng, tôi là một C, C++, C# người hâm mộ phải viết mã bằng cách sử dụng VB.NET bây giờ ... :(Nhưng, tất cả Trong tất cả, nó không phải là xấu cả: VB.NET là thực sự tiết, nhưng nó là một ngôn ngữ khác và tôi có một thời gian tuyệt vời cố gắng để tìm lỗi của nó và điểm mạnh của nó.Cảm ơn :) – SRO

+0

Tôi có kinh nghiệm này thay đổi một vài lần. Việc đầu tiên đi từ C/C++ ISAPI mở rộng để VBScript trong ASP cổ điển và sau đó một lần nữa trong đi từ VBScript để C#. Net trong ASP.Net vì vậy tôi đã thấy điều này một vài lần bây giờ nhưng tôi đã viết đủ mã trong các phiên bản khác nhau của BASIC và C ngôn ngữ mà tôi có thể lật qua lại khá dễ dàng. –

+0

Nếu chúng tôi tính các ký tự, bạn đã bỏ qua các dấu ngoặc đơn bắt buộc trên câu lệnh C# if. – MarkJ

Các vấn đề liên quan