2010-01-08 2 views

답변

8

Or를 사용하는 유일한 해결책은 원하는 경우이다 비트 산술, 즉 사용자가 다수의 비트를 조작 할 :

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

이런 종류 Or 적합한 유일한 경우이다. 다른 모든 경우 (즉, 부울 논리를 사용할 때) OrElse을 사용하십시오.

비슷한 이름에도 불구하고 OrOrElse은 의미 적으로 완전히 다른 작업으로 서로 혼동해서는 안됩니다. Boolean의 내부 표현을 사용하면 비트 단위로 Or을 사용하여 OrElse과 비슷한 효과를 얻을 수 있습니다. (. BASIC와 VB의 이전 버전 - .NET 전에이 -, 더 OrElseOr 작업을 제공하지 에만하여이 관계를 악용)

+1

Konrad가 맞았습니다.하지만 VB 언어의 이전 관리자로부터 자세한 내용을 읽으려면 Paul Vick의 기사 http://www.panopticoncentral.net/archive/2003/08/18/179를 확인하십시오. .aspx –

+0

@ChrisHaas 불행히도 @PaulV는 [그의 오래된 블로그 게시물을 버리기로] (http://panopticoncentral.net/2011/03/29/external-requests-versus-internal-requirements/) 결정 했으므로 이제는 죽은 링크. –

+0

허, 나는 그가 마이크로 소프트를 떠난 것도 몰랐다! –

2

편집 :이 코드는 이다; 나는 이것이 가능하다는 것을 나타 내기 위해이 대답을 덧붙였다.

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

을 FirstThing이 SecondThing 및 ThirdThing가 전체적으로 실행해야합니다 방법은이 경우 : 발생해야 부작용의 일종을 수행하는 식을 평가할 때

또 다른 경우에 사용하는 또는 것 성공 여부를 누적하는 동안 실패했는지 여부를 결정합니다. OrElse를 사용한 경우 FirstThing 또는 SecondThing에 실패하면 실패한 메서드 뒤에있는 작업이 수행되지 않습니다.

+2

이 코드가 잘못되었다는 것을 알기를 바랍니다. 부작용을 원하면 순차적으로 비교하십시오. 위의 코드는 꽤 잘 모호합니다. 나는 버그라고 생각하고 의도하지 않았다고 생각합니다. –

+1

답이 맞기 때문에 +1하지만 콘라드에 동의합니다. 그렇게하는 것이 좋습니다! –

+1

잘못 이해하지 마라. 나는 이것을 조금이라도지지하지 않을 것이다! –

3

비트 단위 산술을 수행 할 때를 제외하고 항상 Or 대신 OrElse를 사용해야합니다.

OrElse는 단락 비교이므로 첫 번째 조건이 참이면 두 번째 조항을 평가하지 않습니다. 단락없이 실패 할 수있는 절을 원하기 때문에 이것은 매우 유용합니다 (예를 들어, x는 아무것도 아닌 OrElse x.HasSomeProperty 임).

두 번째 절의 평가가 중요 할 수 있기 때문에 OrElse의 모든 항목을 자동으로 업그레이드 할 수없는 이유는 다음과 같습니다. 예를 들어, "True 또는 SomeBooleanMethodWhichMightThrowAnEception()"을 쓸 수 있습니다. 이를 OrElse로 변경하면 프로그램의 의미가 변경됩니다.

관련 문제