2011-12-07 22 views
41

Sự khác nhau giữa (OrElse và Or) và (AndAlso và And) là gì? Có bất kỳ sự khác biệt nào trong buổi biểu diễn của họ không, hãy nói rằng lợi ích chính xác? Có bất kỳ tình huống nào mà tôi không sử dụng OrElse và AndAlso không?(OrElse và Or) và (AndAlso và And) - Khi nào nên sử dụng?

+2

có thể trùng lặp [Tôi có nên sử dụng toán tử AndAlso và OrElse không?] (Http://stackoverflow.com/questions/55013/should-i) -nút-sử dụng-the-andalso-and-orelse-khai thác) –

+0

Chỉ mới bắt đầu sử dụng VB.NET (lần đầu tiên trong nhiều năm cho VB). Tôi đến trực tuyến chỉ để hỏi câu hỏi cụ thể này. Tôi cảm ơn @aer và nhiều người đã làm rõ với câu trả lời tuyệt vời của họ. – Hardryv

Trả lời

62

Or/And sẽ luôn đánh giá cả các biểu thức và sau đó trả về kết quả a. Chúng là không phải là ngắn mạch.

OrElse/AndAlsoshort-circuiting. Biểu thức đúng chỉ được đánh giá nếu kết quả không thể được xác định từ việc đánh giá biểu thức bên trái một mình. (Điều đó có nghĩa: OrElse sẽ chỉ đánh giá biểu thức đúng nếu các biểu hiện trái là sai, và AndAlso sẽ chỉ đánh giá biểu thức đúng nếu biểu thức bên trái là đúng.)

Giả sử rằng không tác dụng phụ xảy ra trong các biểu thức và các biểu thức không phụ thuộc (và bất kỳ phí thực hiện nào bị bỏ qua), thì chúng giống nhau.

Tuy nhiên, trong nhiều trường hợp, biểu thức là phụ thuộc. Ví dụ, chúng tôi muốn làm một cái gì đó khi một danh sách không-Không có gì và có nhiều hơn một phần tử: (! Hoặc tác dụng phụ, ick)

If list IsNot Nothing AndAlso list.Length > 0 Then .. 'list has stuff 

này cũng có thể được sử dụng để tránh một "đắt" tính toán :

If Not Validate(x) OrElse Not ExpensiveValidate(x) Then .. 'not valid 

Cá nhân, tôi thấy rằng AndAlsoOrElseđúng nhà khai thác để sử dụng trong tất cả ngoại trừ 1% - hoặc ít hơn, hy vọng! - trong trường hợp tác dụng phụ mong muốn.

Mã hóa vui vẻ.


Một ngoại lệ ném trong biểu thức đầu tiên sẽ ngăn chặn các biểu hiện thứ hai từ đang được đánh giá, nhưng điều này hầu như không có gì ngạc nhiên ..

4

Sự khác biệt là OrElse và AndAlso sẽ ngắn mạch dựa về điều kiện đầu tiên, có nghĩa là nếu điều kiện đầu tiên không vượt qua, điều kiện thứ hai (hoặc nhiều hơn) sẽ không được đánh giá. Điều này đặc biệt hữu ích khi một trong các điều kiện có thể chuyên sâu hơn so với điều kiện khác.

Ví dụ nơi Or là tốt (cả hai điều kiện đánh giá):

If Name = "Fred" Or Name = "Sam" Then 

Nó thực sự không quan trọng mà con đường xung quanh họ được đánh giá

Sau đây AndAlso rất hữu ích vì điều kiện thứ hai có thể thất bại

If Not SomeObject Is Nothing AndAlso CheckObjectExistsInDatabase(SomeObject) Then 

Điều này cho phép điều kiện đầu tiên kiểm tra xem đối tượng đã được đặt và bật chưa y nếu nó đã được thiết lập sẽ đi và kiểm tra cơ sở dữ liệu (hoặc một số nhiệm vụ khác). Nếu đây là từ khóa đơn giản là And, cả hai đều sẽ được đánh giá.

10

Bên cạnh việc đoản mạch được đề cập trong các câu trả lời khác, Or/And có thể sử dụng như các toán tử bitwise trong đó OrElse/AndAlso thì không. Các hoạt động bitwise bao gồm việc kết hợp các giá trị của các cờ enums, chẳng hạn như điều tra FileAttributes nơi bạn có thể chỉ ra một tệp vừa được đọc và bị ẩn bởi FileAttributes.ReadOnly Or FileAttributes.Hidden

2

@Gideon - vui mừng ai đó đã chỉ ra điều đó. Đây là một thử nghiệm đơn giản cho thấy tác động đáng kể của AndAlso:

Dim tm As New Stopwatch 
    Const tries As Integer = 123456 
    Dim z As Integer = 0 
    Dim s() As String = New String() {"0", "one"} 

    Debug.WriteLine("AndAlso") 
    For x As Integer = 0 To s.Length - 1 
     z = 0 
     tm.Restart() 'restart the stopwatch 
     For y As Integer = 0 To tries 
      If s(x) = x.ToString AndAlso s(x) = y.ToString Then '<<<<<<<<<< 
       z += 1 
      End If 
     Next 
     tm.Stop() 
     Debug.WriteLine(x.ToString.PadRight(3, " "c) & z.ToString.PadRight(10, " "c) & tm.Elapsed.ToString) 
    Next 

    Debug.WriteLine("And") 
    For x As Integer = 0 To s.Length - 1 
     z = 0 
     tm.Restart() 'restart the stopwatch 
     For y As Integer = 0 To tries 
      If s(x) = x.ToString And s(x) = y.ToString Then '<<<<<<<<<< 
       z += 1 
      End If 
     Next 
     tm.Stop() 
     Debug.WriteLine(x.ToString.PadRight(3, " "c) & z.ToString.PadRight(10, " "c) & tm.Elapsed.ToString) 
    Next 
Các vấn đề liên quan