VB.NET에서 And와 AndAlso의 차이점은 무엇입니까?

VB.NET에서 And와 의 차이점은 무엇 AndAlso입니까? 어느 것을 사용해야합니까?



답변

And연산자 양쪽을 평가 여기서 AndAlso평가하여 우측 경우 및 좌측에 해당하는 경우에만.

예를 들면 :

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

위의 경우 예외가 발생합니다. mystring = Nothing

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

이것은 예외를 던지지 않습니다.

따라서 C # 세계에서 온 사람은을 사용하는 AndAlso것처럼 사용해야 &&합니다.

자세한 정보는 여기 : http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/


답변

And는 조건이 거짓 알고있는 경우 Andalso 운영자가 중지됩니다 반면 운영자는 계속하기 전에 성명에서 모든 조건을 확인합니다. 예를 들면 다음과 같습니다.

if x = 5 And y = 7

x가 5와 같은지 확인하고 y가 7과 같으면 둘 다 참이면 계속합니다.

if x = 5 AndAlso y = 7

x가 5인지 확인합니다. 그렇지 않으면 조건이 이미 거짓임을 알기 때문에 y가 7인지 확인하지 않습니다. 이것을 단락이라고합니다.

일반적으로 사람들은 첫 번째 부분이 사실이 아닌 경우 두 번째 부분을 명시 적으로 확인하지 않는 이유가있는 경우 단락 방법을 사용합니다 (예 : 체크하면 예외가 발생하는 경우). 예를 들면 다음과 같습니다.

If Not Object Is Nothing AndAlso Object.Load()

And대신을 ( 를) 사용 하는 경우에도 불구하고 AndAlso계속 시도 하면 예외가 발생합니다.Object.Load()nothing


답변

흥미롭게 답변 아무도 언급하지 AndOr반면, 비트 연산자이다 VB.NET에서 OrElseAndAlso엄격 부울 연산자입니다.

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

참고 : 0이 아닌 정수가 고려됩니다 true. 시연 으로 Dim e = not 0설정 e됩니다 비트 연산자입니다.-1Not

||그리고 &&합니다 (C #의 버전 OrElse과는 AndAlso) 될 마지막 평가 표현 반환 3하고 5각각을. 이를 통해 v || 5C # 의 관용구를 사용하여 is 또는 ( 및 정수) 일 5때 표현식 의 값으로, 그렇지 않으면 값으로 제공 할 수 있습니다. 시맨틱의 차이점은 VB.NET에서 작동하지 않는 VB.NET 오프 가드에서 C # 프로그래머를 잡을 수 있습니다.vnull0v

그래서, 질문에 대답하기 위해 사용 : OrAnd비트 연산 (정수 또는 부울)에 대한합니다. 사용 OrElseAndAlso“단락”작업에 시간을 절약하거나 평가하기 전에 평가의 유효성을 테스트합니다. If valid(evaluation) andalso evaluation then또는if not (unsafe(evaluation) orelse (not evaluation)) then

보너스 : 다음의 가치는 무엇입니까?

Dim e = Not 0 And 3


답변

If Bool1 And Bool2 Then

Bool1과 Bool2를 평가합니다

If Bool1 AndAlso Bool2 Then

Bool1이 true 인 경우에만 Bool2를 평가합니다.


답변

부작용이 악하다고 말하는 모든 사람들에게있어 : 한 조건에서 두 가지 부작용이 좋은 곳은 두 개의 파일 객체를 함께 읽는 것입니다.

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

를 사용 And하면 조건을 확인할 때마다 행이 사용됩니다. 반면 AndAlso에 마지막 줄을 읽고 소비 된 줄없이 File1남겨 둘 File2수 있습니다.

물론 코드 위의이 작동하지 않을 것입니다,하지만 난 이런 부작용이 모든 시간을 사용하여 “그것을 고려하지 않을 나쁜 “또는 ” 일부 믿고 당신을 이끌 것으로”코드입니다. 읽기 쉽고 효율적입니다.


답변

그것에 대해 생각하는 간단한 방법은 더 평범한 영어를 사용하는 것입니다

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


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


답변

AndAlso는 And와 비슷하지만 C #, C ++ 등에서 &&처럼 작동합니다.

차이점은 첫 번째 절 (AndAlso 앞의 절)이 true 인 경우 두 번째 절은 평가되지 않으며 복합 논리식이 “단락”된다는 것입니다.

이것은 때때로 다음과 같은 표현식에서 매우 유용합니다.

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

myObj가 null 인 경우 위의 식에서 old And를 사용하면 NullReferenceException이 발생합니다.