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


답변:


380

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/


2
"추가 정보"링크가 끊어졌습니다. 다음은 새로운 URL입니다 : panopticoncentral.net/2003/08/18/…
Rory O'Kane

12
왜 그들이 "AndThen"을 선택하지 않았는지 아는 사람이 있습니까? 나는 이것이 더 직관적이라고 생각합니다.
tmighty

7
나는 항상 이것이 직관적이지 않다고 생각했습니다. 그리고 둘 다 확인한다는 것을 암시하고 이것은 다른 방향이어야합니다! 따라서 왜 이런 것들을 확인하기 위해 SO에 와야합니까 (예, AC # 녀석입니다). "And와 AndAlso의 차이"와 같은 질문을 할 필요도 없습니다. 너무 많은 ands! 나의 영어 선생님이 나를 죽였을 것입니다
Robin French

3
OrElse를 사용할 때마다 항상 사우스 파크를 생각합니다. "정확하게"
Robin French

1
@tmighty Then는 자체 키워드 이기 때문에 더 혼란을 일으킬 것이라고 추측합니다 .
binki

29

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


14
오른쪽에 필요한 부작용이 있으면 "And"를 사용하지 말고 왼쪽으로 옮기십시오. 경우에만 정말 필요 "그리고" 측면 부작용이있다. 그리고 그 부작용이 계속된다면 아마도 다른 일을하고있을 것입니다.
Joel Coehoorn

1
첫째, Andalso는 주로 '런타임에 저장'하는 데 사용되지 않습니다. 둘째, 두 번째 주장이 유용한 '부작용'을 수행하는 것은 추악한 나쁜 습관입니다.
Tor Haugen

2
그래도 '런타임에 저장'하지 않는다고 주장 할 수는 없습니다. 그리고 부작용이 실제로 나쁜 추악한 습관이 아닌 상황을 발견했습니다.
Ed Marty

1
"두 번째 부분을 명시 적으로 확인하지 않는 이유가 있다면 사람들은 일반적으로 단락 방법을 사용합니다" Erm, wut? 나는 사람들이하지 말아야 할 이유가 없다면 단락을 사용하기를 바랍니다! 아무도 이전 사용 안 and/를 or내가 합법적 인 사람이 몇 &까지 사이에 생각있는 - 그들이 이유가없는. 기본적으로 대부분의 다른 언어는 기본적으로 단락되는 이유가 있습니다. 결과에 영향을 미치지 않으면 서 비용이 많이 드는 표현은 아무 것도 기여하지 않을 때 평가하지 않습니다. 조건에서 부작용이 생기면 부작용이 없어야합니다. 하지만 그건 내 의견 일뿐입니다.
underscore_d

20

흥미롭게 답변 아무도 언급하지 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

나는 당신이 혼란 한 생각 ||&&함께 ??. ||비 거짓 값을 반환하는 언어가 있지만 C #은 그중 하나가 아니며 결과 bool를 얻는 nullable 연산자를 제외 하고 반환합니다.Nullable<bool>
Ben Voigt

14
If Bool1 And Bool2 Then

Bool1과 Bool2를 평가합니다

If Bool1 AndAlso Bool2 Then

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


13

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

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

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

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


5

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

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


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

3
사양이 없기 때문에 영어가 코드보다 더 혼란 스럽다!
binki

5

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

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

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

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

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


5

스택 오버플로 질문 : 항상 AndAlso 및 OrElse 연산자를 사용해야합니까?를 참조하십시오. .

또한 : And표현의 오른쪽에 부작용이있는 경우 사용을 언급 한 사람들에 대한 의견 :

오른쪽에 필요한 부작용이 있으면 "And"를 사용하지 말고 왼쪽으로 옮기십시오. 경우에만 정말 필요 "그리고" 측면 부작용이있다. 그리고 그 부작용이 계속된다면 아마도 다른 일을하고있을 것입니다. 일반적으로 AndAlso를 선호해야합니다.


3

위의 답변 외에도 AndAlso는 단락이라고 알려진 컨디셔닝 프로세스를 제공합니다. 많은 프로그래밍 언어에는 vb.net과 같이이 기능이 내장되어 있으며 불필요한 평가를 제거하여 장기 조건문에서 상당한 성능 향상을 제공 할 수 있습니다.

또 다른 유사한 조건은 왼쪽 조건이 거짓 인 경우에만 올바른 조건을 확인하여 실제 조건을 찾은 후 불필요한 조건 확인을 차단하는 OrElse 조건입니다.

나는 항상 단락 프로세스를 사용하고 이것에 의해 가장 큰 혜택을 얻을 수있는 방식으로 조건문을 구성하는 것이 좋습니다. 예를 들어, 가장 효율적이고 빠른 조건을 먼저 테스트하여 다른 시간을 절대로 단축해야 할 때에 만 긴 조건을 실행하십시오.


또한 IIF (Immediate If)도 언급 할 가치가 있습니다. 왜냐하면 단락이 아니며 프로그래머의 의도와는 다른 조건을 만들 수 있기 때문입니다. 왜냐하면 진정한 성분과 거짓 성분 모두가 평가되기 때문입니다. 이전에 누군가가이 부작용을 의도적으로 사용한다고 말했지만,-즉석 If는 내가 감지 할 수있는 방식으로 평가를 수행 할 의도적 인 의도가 없기 때문에 효과적인 방법으로 보지 않습니다.
jinzai

"위의 답변 외에도 AndAlso는 단락이라고하는 컨디셔닝 프로세스를 제공합니다." 이 답변 위의 모든 답변은 단락에 중점을 둡니다. : P 그러나 좋은 설명과 권장 사항.
underscore_d

1

우리 대부분의 경우 OrElse와 AndAlso는 몇 가지 혼란스러운 예외 (Or And And를 사용해야 할 경우 1 % 미만)를 제외하고 트릭을 수행합니다.

사람들이 부울 논리를 과시하고 로켓 과학처럼 보이게 만들지 마십시오.

매우 간단하고 직설적이며 때로는 논리가 마음에 들지 않기 때문에 시스템이 예상대로 작동하지 않을 수 있습니다. 그러나 당신의 두뇌는 그의 논리가 100 % 테스트되고 입증되었으며 작동해야한다고 말하고 있습니다. 바로 그 순간에 당신의 두뇌에 대한 신뢰를 멈추고 그에게 다시 생각하거나 OrElse 나 OrElse가 아닌 다른 논리를 요구하지 않는 다른 직업을 찾도록 강요하십시오.


0

대구가 아닌 단어로 이해하려면 :

사용 사례 :
"And"를 사용하면 컴파일러가 모든 조건을 확인하므로 개체가 "Nothing"인지 확인한 다음 해당 속성 중 하나를 확인하면 런타임 오류가 발생합니다.
그러나 AndAlso를 사용하면 조건에서 첫 번째 "거짓"이 발생하여 다음 값을 확인하므로 오류가 발생하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.