2011-12-07 4 views
41

(OrElse 및 Or)과 (AndAlso 및 And)의 차이점은 무엇입니까? 그들의 공연에 어떤 차이가 있습니까? OrElse와 AndAlso를 사용하지 않는 상황이 있습니까?(OrElse 및 Or) 및 (AndAlso 및 And) - 언제 사용합니까?

+2

가능한 중복 http://stackoverflow.com/questions/55013/should-i : 여기 AndAlso의 극적인 효과를 보여줍니다 간단한 테스트입니다 -always-use-thealso-and-orelse-operators) –

+0

VB.NET을 사용하기 시작했습니다. (VB에서는 여러 해 동안 처음 사용되었습니다). 나는이 특정한 질문을하기 위해서만 온라인에왔다. @aer와 그들의 큰 해답으로 분명히 밝힌 많은 사람들에게 감사드립니다. – Hardryv

답변

62

Or/And항상에게 모두1 표현식을 평가 한 후 그 결과를 반환합니다. 그들은 이 아니고 단락입니다.

OrElse/AndAlsoshort-circuiting입니다. 올바른 표현식은 왼쪽 표현식 만 평가 한 결과를 결정할 수없는 경우에만 평가됩니다. (즉 의미 : 왼쪽 표현이 false 인 경우 OrElse은 올바른 표현식을 평가하며, 왼쪽 표현에 해당하는 경우 AndAlso는 올바른 표현을 평가합니다.)

부작용이 표현에서 발생하지 않고 가정하면 표현 은 종속되지 않습니다. (모든 실행 오버 헤드는 무시됩니다), 그러면 동일합니다.

그러나 많은 경우에 식 에 종속적입니다. 목록이 없습니다 - 아무것도하고 두 개 이상의 요소가있는 경우 예를 들어, 우리는 무언가를 할 : (! 또는 부작용, ICK) 이것은 또한 "비싼"계산을 피하기 위해 사용할 수 있습니다

If list IsNot Nothing AndAlso list.Length > 0 Then .. 'list has stuff 

을 - 희망, 작거나 개인적으로

If Not Validate(x) OrElse Not ExpensiveValidate(x) Then .. 'not valid 

, 나는 AndAlsoOrElse 모두에서 사용할 수있는 올바른 사업자하지만 1 % 것을 발견! - 부작용이있는 경우 입니다.

해피 코딩.


1 평가되는 제 발현을 방지 할 제 식 던져진 예외 있지만 거의 놀라운 없어야 ..

4

차는 OrElse라는 및 AndAlso가 단락 기반한다는 것이다 첫 번째 조건이 통과하지 못하면 두 번째 (이상) 조건이 평가되지 않음을 의미합니다. 이는 조건 중 하나가 다른 것보다 더 집중적 일 때 특히 유용합니다.Or 괜찮

예 (두 조건을 평가) :

If Name = "Fred" Or Name = "Sam" Then 

이 정말 어떤 방법으로 문제가되지 않습니다 그들이 두 번째 조건은

을 실패 할 수 있기 때문에 AndAlso 유용 다음

을 평가 주위에

If Not SomeObject Is Nothing AndAlso CheckObjectExistsInDatabase(SomeObject) Then 

이렇게하면 첫 번째 조건에서 개체가 설정되어 있는지 확인하고 y가 설정되면 데이터베이스 (또는 다른 작업)를 검사합니다. 이것이 일반 And 키워드 였으면 둘 다 평가됩니다.

10

다른 답변에서 언급 된 단락 이외에 OrElse/AndAlso이없는 비트 연산자 인 Or/And을 사용할 수 있습니다. 비트 단위 연산에는 FileAttributes 열거 형과 같은 Flags 열거 형 값을 조합하여 파일이 읽기 전용이고 숨김임을 나타낼 수 있습니다. FileAttributes.ReadOnly Or FileAttributes.Hidden

2

@ 기디언 - 기쁜 누군가가 지적했습니다.

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 
[? 난 항상 AndAlso 및 OrElse라는 연산자를 사용해야] (의
관련 문제