답변:
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/
Then
는 자체 키워드 이기 때문에 더 혼란을 일으킬 것이라고 추측합니다 .
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
and
/를 or
내가 합법적 인 사람이 몇 &까지 사이에 생각있는 - 그들이 이유가없는. 기본적으로 대부분의 다른 언어는 기본적으로 단락되는 이유가 있습니다. 결과에 영향을 미치지 않으면 서 비용이 많이 드는 표현은 아무 것도 기여하지 않을 때 평가하지 않습니다. 조건에서 부작용이 생기면 부작용이 없어야합니다. 하지만 그건 내 의견 일뿐입니다.
흥미롭게 답변 아무도 언급하지 And
및 Or
반면, 비트 연산자이다 VB.NET에서 OrElse
와 AndAlso
엄격 부울 연산자입니다.
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
됩니다 비트 연산자입니다.-1
Not
||
그리고 &&
합니다 (C #의 버전 OrElse
과는 AndAlso
) 될 마지막 평가 표현 반환 3
하고 5
각각을. 이를 통해 v || 5
C # 의 관용구를 사용하여 is 또는 ( 및 정수) 일 5
때 표현식 의 값으로, 그렇지 않으면 값으로 제공 할 수 있습니다. 시맨틱의 차이점은 VB.NET에서 작동하지 않는 VB.NET 오프 가드에서 C # 프로그래머를 잡을 수 있습니다.v
null
0
v
그래서, 질문에 대답하기 위해 사용 : Or
및 And
비트 연산 (정수 또는 부울)에 대한합니다. 사용 OrElse
및 AndAlso
"단락"작업에 시간을 절약하거나 평가하기 전에 평가의 유효성을 테스트합니다. 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>
부작용이 악하다고 말하는 모든 사람들에게있어 : 한 조건에서 두 가지 부작용이 좋은 곳은 두 개의 파일 객체를 함께 읽는 것입니다.
While File1.Seek_Next_Row() And File2.Seek_Next_Row()
Str1 = File1.GetRow()
Str2 = File2.GetRow()
End While
를 사용 And
하면 조건을 확인할 때마다 행이 사용됩니다. 반면 AndAlso
에 마지막 줄을 읽고 소비 된 줄없이 File1
남겨 둘 File2
수 있습니다.
물론 코드 위의이 작동하지 않을 것입니다,하지만 난 이런 부작용이 모든 시간을 사용하여 "그것을 고려하지 않을 나쁜 "또는 " 악 일부 믿고 당신을 이끌 것으로"코드입니다. 읽기 쉽고 효율적입니다.
AndAlso는 And와 비슷하지만 C #, C ++ 등에서 &&처럼 작동합니다.
차이점은 첫 번째 절 (AndAlso 앞의 절)이 true 인 경우 두 번째 절은 평가되지 않으며 복합 논리식이 "단락"된다는 것입니다.
이것은 때때로 다음과 같은 표현식에서 매우 유용합니다.
If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then
...
End If
myObj가 null 인 경우 위의 식에서 old And를 사용하면 NullReferenceException이 발생합니다.
스택 오버플로 질문 : 항상 AndAlso 및 OrElse 연산자를 사용해야합니까?를 참조하십시오. .
또한 : And
표현의 오른쪽에 부작용이있는 경우 사용을 언급 한 사람들에 대한 의견 :
오른쪽에 필요한 부작용이 있으면 "And"를 사용하지 말고 왼쪽으로 옮기십시오. 경우에만 정말 필요 "그리고" 두 측면 부작용이있다. 그리고 그 부작용이 계속된다면 아마도 다른 일을하고있을 것입니다. 일반적으로 AndAlso를 선호해야합니다.
위의 답변 외에도 AndAlso는 단락이라고 알려진 컨디셔닝 프로세스를 제공합니다. 많은 프로그래밍 언어에는 vb.net과 같이이 기능이 내장되어 있으며 불필요한 평가를 제거하여 장기 조건문에서 상당한 성능 향상을 제공 할 수 있습니다.
또 다른 유사한 조건은 왼쪽 조건이 거짓 인 경우에만 올바른 조건을 확인하여 실제 조건을 찾은 후 불필요한 조건 확인을 차단하는 OrElse 조건입니다.
나는 항상 단락 프로세스를 사용하고 이것에 의해 가장 큰 혜택을 얻을 수있는 방식으로 조건문을 구성하는 것이 좋습니다. 예를 들어, 가장 효율적이고 빠른 조건을 먼저 테스트하여 다른 시간을 절대로 단축해야 할 때에 만 긴 조건을 실행하십시오.
우리 대부분의 경우 OrElse와 AndAlso는 몇 가지 혼란스러운 예외 (Or And And를 사용해야 할 경우 1 % 미만)를 제외하고 트릭을 수행합니다.
사람들이 부울 논리를 과시하고 로켓 과학처럼 보이게 만들지 마십시오.
매우 간단하고 직설적이며 때로는 논리가 마음에 들지 않기 때문에 시스템이 예상대로 작동하지 않을 수 있습니다. 그러나 당신의 두뇌는 그의 논리가 100 % 테스트되고 입증되었으며 작동해야한다고 말하고 있습니다. 바로 그 순간에 당신의 두뇌에 대한 신뢰를 멈추고 그에게 다시 생각하거나 OrElse 나 OrElse가 아닌 다른 논리를 요구하지 않는 다른 직업을 찾도록 강요하십시오.