2010-01-08 33 views

Trả lời

8

Giải pháp duy nhất để sử dụng Or là khi bạn muốn Bitwise số học, ví dụ: bạn muốn thao tác các bit trong một số:

Sub SetBit(value As Integer, Bit As Integer) 
    value = value Or (1 << Bit) 
End Sub 

loại Đây là trường hợp duy nhất thích hợp cho Or. Trong tất cả các trường hợp khác (tức là khi sử dụng logic Boolean), hãy sử dụng OrElse.

Mặc dù có tên tương tự, OrOrElse là các hoạt động khá khác biệt về mặt ngữ nghĩa và không nên nhầm lẫn với nhau. Nó chỉ như vậy sẽ xảy ra là các đại diện nội bộ của Boolean s làm cho nó có thể sử dụng bitwise Or để đạt được một hiệu ứng tương tự (nhưng không giống nhau) để OrElse. (. Phiên bản cũ của BASIC và VB - trước khi NET - khai thác mối quan hệ này bằng cách chỉ cung cấp một hoạt động Or, không OrElse)

+1

Konrad đã làm đúng nhưng nếu bạn muốn đọc thêm về nó từ người bảo trì trước đó của ngôn ngữ VB bạn có thể kiểm tra bài viết của Paul Vick http://www.panopticoncentral.net/archive/2003/08/18/179 .aspx –

+0

@ChrisHaas Thật không may @PaulV đã quyết định [thả bài đăng trên blog cũ của anh ấy] (http://panopticoncentral.net/2011/03/29/external-requests-versus-internal-requirements/), vì vậy, đây là một liên kết chết. –

+0

Huh, tôi thậm chí còn không biết anh ấy đã rời khỏi Microsoft! –

2

Sửa: Mã này là ác; Tôi chỉ thêm câu trả lời này để cho biết rằng điều này là có thể.

trường hợp khác sẽ được sử dụng Hoặc khi đánh giá biểu thức mà thực hiện một số loại tác dụng phụ đó phải xảy ra:

Sub DoSomething() 
    Dim succeeded As Boolean 
    succeeded = FirstThing() Or SecondThing() Or ThirdThing() 
    If succeeded Then 
     ' Do something here 
    End If 
End Sub 

Trong trường hợp này FirstThing, SecondThing, và ThirdThing là phương pháp mà phải được thực hiện như một toàn thể cho dù bất kỳ trong số họ thất bại hay không, trong khi tích lũy một giá trị thành công. Nếu bạn đã sử dụng OrElse thì nếu FirstThing hoặc SecondThing thất bại, thì các hoạt động đằng sau phương thức thất bại sẽ không xảy ra.

+2

Tôi hy vọng bạn nhận ra rằng mã này là ác. Nếu bạn muốn các tác dụng phụ, sau đó thực hiện so sánh tuần tự. Đoạn mã trên khá rõ ràng: tôi cho một người sẽ ngay lập tức nghĩ rằng đó là một lỗi và không dự định. –

+1

+1 vì câu trả lời của bạn là chính xác, nhưng tôi đồng ý với Konrad, nó không phải là một thực hành tốt để làm như vậy! –

+1

Đừng hiểu lầm tôi - Tôi không ủng hộ điều này một chút! –

3

Bạn nên luôn sử dụng OrElse thay cho Or, ngoại trừ khi thực hiện số học bit-khôn ngoan.

OrElse là so sánh ngắn mạch, có nghĩa là nó sẽ không đánh giá mệnh đề thứ hai nếu mệnh đề thứ nhất là đúng. Điều này là cực kỳ hữu ích, bởi vì bạn sẽ thường muốn mệnh đề có thể thất bại mà không có shortcircuiting (ví dụ: x là không có gì OrElse không x.HasSomeProperty).

Lý do không thể tự động nâng cấp tất cả 'Or's thành' OrElse là vì việc đánh giá mệnh đề thứ hai có thể là quan trọng. Ví dụ, tôi có thể viết "True hoặc SomeBooleanMethodWhichMightThrowAnEception()". Thay đổi điều đó hoặc thành một OrElse sẽ thay đổi ý nghĩa của chương trình.

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