Sự khác biệt giữa And và AndAlso trong VB.NET là gì?


Câu trả lời:


380

Các Andnhà điều hành đánh giá cả hai bên, nơi AndAlsođánh giá lại phía bên phải khi và chỉ khi ở phía bên trái là đúng.

Một ví dụ:

If mystring IsNot Nothing And mystring.Contains("Foo") Then
  ' bla bla
End If

Ở trên ném một ngoại lệ nếu mystring = Nothing

If mystring IsNot Nothing AndAlso mystring.Contains("Foo") Then
  ' bla bla
End If

Điều này không ném một ngoại lệ.

Vì vậy, nếu bạn đến từ thế giới C #, bạn nên sử dụng AndAlsonhư bạn sẽ sử dụng &&.

Thêm thông tin ở đây: http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/


2
Liên kết "Thông tin thêm" bị hỏng. Đây là URL mới: panopticoncentral.net/2003/08/18/ từ
Rory O'Kane

12
Có ai biết tại sao họ không chọn "AndThen" không? Tôi nghĩ rằng điều này sẽ trực quan hơn.
tmighty

7
Tôi đã luôn nghĩ rằng điều này là phản trực giác. AndAlso cũng ngụ ý rằng nó sẽ kiểm tra cả hai và điều này sẽ là cách khác! Do đó tại sao tôi phải đến SO để kiểm tra những thứ như thế này (vâng tôi là anh chàng ac #). Bạn cũng không bao giờ phải đặt câu hỏi như "sự khác biệt giữa And và Andso". Quá nhiều ands! Giáo viên tiếng Anh của tôi đã giết tôi
Robin French

3
Bất cứ khi nào tôi sử dụng OrElse, tôi luôn nghĩ về South Park "Hoặc nếu không thì sao?" "Chính xác"
Robin Pháp

1
@tmighty đoán rằng nó sẽ gây ra nhiều nhầm lẫn hơn vì đó Thenlà từ khóa riêng của nó.
biley

29

Các Andnhà điều hành sẽ rà soát tất cả các điều kiện trong báo cáo trước khi tiếp tục, trong khi các nhà điều hành AndAlso sẽ ngừng nếu nó biết tình trạng này là sai. Ví dụ:

if x = 5 And y = 7

Kiểm tra xem x có bằng 5 không và nếu y bằng 7 thì tiếp tục nếu cả hai đều đúng.

if x = 5 AndAlso y = 7

Kiểm tra xem x có bằng 5. Nếu không, nó sẽ không kiểm tra nếu y là 7, vì nó biết rằng điều kiện này là sai. (Điều này được gọi là ngắn mạch.)

Nói chung, mọi người sử dụng phương pháp đoản mạch nếu có lý do để không kiểm tra rõ ràng phần thứ hai nếu phần thứ nhất không đúng, chẳng hạn như nếu nó sẽ ném ngoại lệ nếu được chọn. Ví dụ:

If Not Object Is Nothing AndAlso Object.Load()

Nếu nó được sử dụng Andthay vì AndAlso, nó vẫn sẽ cố gắng Object.Load()ngay cả khi nó là nothingmột ngoại lệ.


14
Nếu bên phải có tác dụng phụ bạn cần, chỉ cần di chuyển nó sang bên trái thay vì sử dụng "Và". Bạn chỉ thực sự cần "Và" nếu cả hai bên đều có tác dụng phụ. Và nếu bạn có nhiều tác dụng phụ xảy ra, có lẽ bạn đã làm sai điều gì khác.
Joel Coehoorn

1
Đầu tiên, Andalso không được sử dụng chủ yếu để 'tiết kiệm thời gian chạy', đó là sự kích thích. Thứ hai, có đối số thứ hai thực hiện một số 'tác dụng phụ' hữu ích là thực hành xấu xấu xí.
Tor Haugen

2
Bạn không thể tranh luận rằng nó không 'tiết kiệm thời gian chạy' mặc dù. Và tôi đã tìm thấy những tình huống trong đó thực tế là tác dụng phụ, không phải là thực hành xấu xấu xí.
Ed Marty

1
"Nói chung mọi người sử dụng phương pháp ngắn mạch nếu có lý do để rõ ràng không kiểm tra phần thứ hai" Erm, wut? Tôi hy vọng mọi người sử dụng ngắn mạch trừ khi họ có lý do để không! Không ai nên sử dụng cái cũ and/ ortrừ khi họ có lý do - trong đó tôi nghĩ rằng những cái hợp pháp là rất ít và xa. Chắc chắn có một lý do khiến hầu hết các ngôn ngữ khác bị đoản mạch theo mặc định: nó giữ nguyên ý nghĩa của kết quả trong khi không đánh giá các biểu thức có khả năng tốn kém khi chúng không đóng góp gì. Tác dụng phụ của Stashing trong các điều kiện nên là, tốt, mắt phụ. Nhưng đó chỉ là ý kiến ​​của tôi ...
gạch dưới

20

Điều thú vị là không có câu trả lời nào được đề cập đến AndOrtrong VB.NET là các toán tử bit trong khi đó OrElseAndAlsolà các toán tử Boolean.

Dim a = 3 OR 5 ' Will set a to the value 7, 011 or 101 = 111
Dim a = 3 And 5 ' Will set a to the value 1, 011 and 101 = 001
Dim b = 3 OrElse 5 ' Will set b to the value true and not evaluate the 5
Dim b = 3 AndAlso 5 ' Will set b to the value true after evaluating the 5
Dim c = 0 AndAlso 5 ' Will set c to the value false and not evaluate the 5

Lưu ý : một số nguyên khác không được xem xét true; Dim e = not 0sẽ thiết lập eđể -1chứng minh Notcũng là một toán tử bit.

||&&(C # phiên bản OrElseAndAlso) trả lại biểu hiện đánh giá cuối cùng đó sẽ là 35tương ứng. Điều này cho phép bạn sử dụng thành ngữ v || 5trong C # để đưa ra 5làm giá trị của biểu thức khi vnullhoặc ( 0và một số nguyên) và giá trị vkhác. Sự khác biệt về ngữ nghĩa có thể khiến một lập trình viên C # lao vào VB.NET mất cảnh giác vì "thành ngữ giá trị mặc định" này không hoạt động trong VB.NET.

Vì vậy, để trả lời câu hỏi : Sử dụng OrAndcho các hoạt động bit (số nguyên hoặc Boolean). Sử dụng OrElseAndAlso"đoản mạch" một thao tác để tiết kiệm thời gian hoặc kiểm tra tính hợp lệ của đánh giá trước khi đánh giá nó. If valid(evaluation) andalso evaluation thenhoặc làif not (unsafe(evaluation) orelse (not evaluation)) then

Tiền thưởng: Giá trị của những thứ sau đây là gì?

Dim e = Not 0 And 3

Tôi nghĩ rằng bạn đã nhầm lẫn ||&&với ??. Mặc dù có các ngôn ngữ ||sẽ trả về giá trị không phải chim ưng, C # không phải là một trong số chúng và trả về một bool(ngoại trừ các toán tử nullable được nâng lên, nơi bạn nhận được Nullable<bool>kết quả)
Ben Voigt

14
If Bool1 And Bool2 Then

Đánh giá cả Bool1 và Bool2

If Bool1 AndAlso Bool2 Then

Đánh giá Bool2 khi và chỉ khi Bool1 đúng.


13

Chỉ dành cho tất cả những người nói rằng tác dụng phụ là xấu: một nơi có hai tác dụng phụ trong một điều kiện là tốt sẽ đọc hai đối tượng tệp cùng một lúc.

While File1.Seek_Next_Row() And File2.Seek_Next_Row()
    Str1 = File1.GetRow()
    Str2 = File2.GetRow()
End While

Sử dụng Andđảm bảo rằng một hàng được tiêu thụ mỗi khi điều kiện được kiểm tra. Trong khi đó AndAlsocó thể đọc dòng cuối cùng File1và rời đi File2mà không có dòng tiêu thụ.

Tất nhiên mã ở trên sẽ không hoạt động, nhưng tôi luôn sử dụng các tác dụng phụ như thế này và sẽ không coi đó là mã " xấu " hay " xấu " như một số người sẽ khiến bạn tin tưởng. Thật dễ đọc và hiệu quả.


5

Một cách đơn giản để suy nghĩ về nó là sử dụng tiếng Anh thậm chí đơn giản hơn

If Bool1 And Bool2 Then
If [both are true] Then


If Bool1 AndAlso Bool2 Then
If [first is true then evaluate the second] Then

3
Tiếng Anh khó hiểu hơn mã bởi vì nó không có thông số kỹ thuật!
biley

5

AndAlso cũng giống như And, ngoại trừ nó hoạt động như && trong C #, C ++, v.v.

Sự khác biệt là nếu mệnh đề thứ nhất (mệnh đề trước AndAlso) là đúng, thì mệnh đề thứ hai không bao giờ được đánh giá - biểu thức logic ghép là "ngắn mạch".

Điều này đôi khi rất hữu ích, ví dụ như trong một biểu thức như:

If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then
   ...
End If

Sử dụng biểu thức cũ và trong biểu thức trên sẽ đưa ra một NullReferenceException nếu myObj là null.


5

Đồng thời xem câu hỏi Stack Overflow: Tôi có nên luôn sử dụng toán tử AndAlso và OrElse không? .

Ngoài ra: Một nhận xét cho những người đã đề cập sử dụng Andnếu phía bên phải của biểu thức có tác dụng phụ bạn cần:

Nếu bên phải có tác dụng phụ bạn cần, chỉ cần di chuyển nó sang bên trái thay vì sử dụng "Và". Bạn chỉ thực sự cần "Và" nếu cả hai bên đều có tác dụng phụ. Và nếu bạn có nhiều tác dụng phụ xảy ra, có lẽ bạn đã làm sai điều gì khác. Nói chung, bạn thực sự nên thích AndAlso.


3

Ngoài các câu trả lời ở trên, AndAlso cung cấp một quy trình điều hòa được gọi là ngắn mạch. Nhiều ngôn ngữ lập trình có chức năng này được tích hợp như vb.net, và có thể cung cấp hiệu suất tăng đáng kể trong các báo cáo điều kiện dài bằng cách loại bỏ các đánh giá không cần thiết.

Một điều kiện tương tự khác là điều kiện OrElse sẽ chỉ kiểm tra điều kiện bên phải nếu điều kiện bên trái là sai, do đó cắt bỏ kiểm tra điều kiện không cần thiết sau khi tìm thấy điều kiện thực.

Tôi sẽ khuyên bạn luôn luôn sử dụng các quy trình ngắn mạch và cấu trúc các câu điều kiện của bạn theo những cách có thể mang lại lợi ích cao nhất cho việc này. Ví dụ, trước tiên hãy kiểm tra các điều kiện hiệu quả nhất và nhanh nhất của bạn để bạn chỉ chạy các điều kiện dài khi bạn hoàn toàn phải và đoản mạch vào các thời điểm khác.


Một điều đáng nói nữa là IIF (Im Instant If) vì nó không bị đoản mạch và có thể tạo ra các điều kiện hoàn toàn không giống với ý định của lập trình viên, vì cả hai thành phần đúng và sai đều được đánh giá. Trước đó, một người nào đó đã tuyên bố rằng họ sử dụng hành vi tác dụng phụ này một cách có chủ ý, nhưng - tôi không xem đó là một phương pháp hiệu quả, vì Im Instant If không có mục đích thực hiện đánh giá theo cách mà tôi có thể phát hiện.
jinzai

"Ngoài các câu trả lời ở trên, AndAlso cung cấp một quy trình điều hòa được gọi là ngắn mạch." Mỗi câu trả lời trên đây tập trung vào ngắn mạch. : P Nhưng mô tả và khuyến nghị tốt.
gạch dưới

1

Đối với đa số chúng ta, OrElse và AndAlso sẽ thực hiện thủ thuật ngoại trừ một vài trường hợp ngoại lệ khó hiểu (dưới 1% trong đó chúng ta có thể phải sử dụng Or và And).

Cố gắng không để mọi người mang đi khoe lôgic boolean của họ và làm cho nó trông giống như một khoa học tên lửa.

Nó khá đơn giản và dễ hiểu và đôi khi hệ thống của bạn có thể không hoạt động như mong đợi vì nó không giống logic của bạn ngay từ đầu. Tuy nhiên, bộ não của bạn tiếp tục nói với bạn rằng logic của anh ta đã được kiểm tra và chứng minh 100% và nó sẽ hoạt động. Ngay lúc đó hãy ngừng tin tưởng vào bộ não của bạn và yêu cầu anh ấy suy nghĩ lại hoặc (không phải OrElse hoặc có thể OrElse), bạn buộc mình phải tìm một công việc khác không đòi hỏi nhiều logic.


0

Để hiểu với các từ không mã hóa:

Ca sử dụng:
Với, và trình biên dịch sẽ kiểm tra tất cả các điều kiện, vì vậy nếu bạn đang kiểm tra xem một đối tượng có thể là không có gì hay không, thì bạn đang kiểm tra một trong các thuộc tính của nó, bạn sẽ gặp lỗi thời gian chạy.
Nhưng với AndAlso với phiên bản giả đầu tiên trong các điều kiện, nó sẽ kiểm tra cái tiếp theo để bạn không gặp lỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.