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?
Trả lời
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/AndAlso
là short-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 AndAlso
và OrElse
là đú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ụ là 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 ..
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á.
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
@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
- 1. Ngoại lệ khi sử dụng phương thức biểu thức OrElse và AndAlso
- 2. Sử dụng AND và OR trong SQLite
- 3. AndAlso/OrElse trong VBA
- 4. Có lợi thế nào khi sử dụng AND và OR trên && và || trong PHP?
- 5. MySQL Nhóm OR và AND khoản
- 6. Solr truy vấn: dừng lời, OR và AND weirdness
- 7. Kết hợp 'AND' và 'OR' Điều kiện trong NSPredicate
- 8. cách thoát đúng OR và AND trong truy vấn lucene?
- 9. Zend Framework 2 Sql Chọn với OR và AND
- 10. Khi nào nên sử dụng hệ thống() và khi nào nên sử dụng execv *()?
- 11. Khi nào tôi nên sử dụng require() và khi nào nên sử dụng define()?
- 12. Khi nào bạn nên sử dụng JCR và khi nào bạn nên sử dụng JPA/RDBMS?
- 13. Codeigniter chọn truy vấn có điều kiện AND và OR
- 14. Khi nào tôi nên sử dụng dấu và với scanf()
- 15. Khi nào tôi nên sử dụng setUpClass và khi __init__?
- 16. jQuery chọn theo thuộc tính bằng cách sử dụng toán tử AND và OR
- 17. Khi nào tôi nên sử dụng remove_reference và add_reference?
- 18. Khi nào nên sử dụng và khi nào không sử dụng Try Catch Cuối cùng
- 19. Khi nào bạn nên sử dụng IEnumerable và GetEnumerator?
- 20. khi nào tôi nên sử dụng _mm_sfence _mm_lfence và _mm_mfence
- 21. Khi nào nên sử dụng <%# ... %> và <%= ... %>?
- 22. Khi nào tôi nên sử dụng perror ("...") và fprintf (stderr, "...")?
- 23. Khi nào và ở đâu tôi nên sử dụng WCF
- 24. Khi nào nên sử dụng $ HTTP_POST_VARS ['field'] và $ _POST ['field']?
- 25. readValue và readTree ở Jackson: khi nào nên sử dụng?
- 26. Request.InputStream là gì và khi nào nên sử dụng?
- 27. Nên sử dụng IsDBNull và IsNull nào?
- 28. Khi nào nên sử dụng node.js và khi nào sử dụng ajax?
- 29. Khi nào nên sử dụng Class.isInstance() và khi nào thì sử dụng toán tử instanceof?
- 30. Khi nào chúng ta nên sử dụng lớp học và khi chúng ta không nên
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) –
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