Trong VB.NET, sự khác biệt giữa And
và là AndAlso
gì? Tôi nên sử dụng cái nào?
Trong VB.NET, sự khác biệt giữa And
và là AndAlso
gì? Tôi nên sử dụng cái nào?
Câu trả lời:
Các And
nhà đ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 AndAlso
như 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/
Then
là từ khóa riêng của nó.
Các And
nhà đ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 And
thay vì AndAlso
, nó vẫn sẽ cố gắng Object.Load()
ngay cả khi nó là nothing
một ngoại lệ.
and
/ or
trừ 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 ...
Điều thú vị là không có câu trả lời nào được đề cập đến And
và Or
trong VB.NET là các toán tử bit trong khi đó OrElse
và AndAlso
là 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 0
sẽ thiết lập e
để -1
chứng minh Not
cũng là một toán tử bit.
||
và &&
(C # phiên bản OrElse
và AndAlso
) trả lại biểu hiện đánh giá cuối cùng đó sẽ là 3
và 5
tương ứng. Điều này cho phép bạn sử dụng thành ngữ v || 5
trong C # để đưa ra 5
làm giá trị của biểu thức khi v
là null
hoặc ( 0
và một số nguyên) và giá trị v
khá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 Or
và And
cho các hoạt động bit (số nguyên hoặc Boolean). Sử dụng OrElse
và AndAlso
"đ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 then
hoặ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
||
và &&
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ả)
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.
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 đó AndAlso
có thể đọc dòng cuối cùng File1
và rời đi File2
mà 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ả.
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.
Đồ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 And
nế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.
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.
Đố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.
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.