2011-01-18 33 views
26

Câu hỏi nhanh, trong đó câu trả lời nhanh nhất và dễ nhất có thể là sắp xếp lại mã liên quan, nhưng hãy xem ...VB.NET 'Nếu' tuyên bố với 'Hoặc' có điều kiện có cả hai mặt được đánh giá?

Vì vậy, tôi có tuyên bố If (một đoạn mã là một phần của giải pháp làm việc đầy đủ) viết bằng C#) viết lại bằng VB.NET. Tôi biết phương pháp VB.NET IIf(a, b, c) đánh giá cả ba không phụ thuộc vào trueness của việc đánh giá đầu tiên, nhưng điều này dường như phải là trường hợp trong xây dựng tiêu chuẩn của tôi, quá:

If (example Is Nothing Or example.Item IsNot compare.Item) Then 
    'Proceed 
End If 

Hay nói đúng hơn, thích hợp hơn:

If (example Is Nothing Or Not example.Item = compare.Item) Then 
    'Proceed 
End If 

ở đây, nếu exampleNothing (null) sau đó tôi vẫn nhận được một NullReferenceException - là điều này là lỗi của tôi, hoặc là nó một cái gì đó tôi chỉ phải chịu đựng tại whim của VB .MẠNG LƯỚI?

+13

Trong 99,9% của tất cả các trường hợp, bạn nên sử dụng ' OrElse' và 'AndAlso' thay vì' hoặc' và 'và'. –

Trả lời

51

Đó là "lỗi" của bạn ở chỗ đó là cách Or được xác định, vì vậy nó hoạt động bạn nên mong đợi:

Trong một so sánh Boolean, các Hoặc toán tử luôn đánh giá cả hai biểu thức, có thể bao gồm thực hiện các cuộc gọi thủ tục. Toán tử OrElse (Visual Basic) thực hiện đoản mạch, có nghĩa là nếu expression1 là True, thì expression2 không được đánh giá.

Nhưng bạn không phải chịu đựng. Bạn có thể sử dụng OrElse để có hành vi đoản mạch.

Vì vậy, bạn có thể muốn:

If (example Is Nothing OrElse Not example.Item = compare.Item) Then 
    'Proceed 
End If 

tôi không thể nói nó đọc khủng khiếp độc đáo, nhưng nó phải làm việc ...

+8

Tuyệt vời, Jon, tôi thấy toàn bộ VB là tiết tú và xấu xí; hy vọng rằng đây là một loại một lần (một lần nữa) loại điều. –

+4

Nó có thể là tiết nhưng xấu xí là một vấn đề của hương vị. Verbose cũng có thể có nghĩa là có thể đọc được, tôi nghĩ rằng đó chỉ là vấn đề quen thuộc. –

+0

@Tim Euclid's Elements dễ đọc, thậm chí nhiều hơn khi so sánh với ngôn ngữ này. –

22

OrElse là tương đương với ngắn mạch của Or

+0

Cảm ơn - đẹp n 'nhanh chóng! ;) –

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