今日やっとAndとAndAlsoの違いを発見しました


以前AndAlsoに会ったことがありますが、ずっと気にしていません.資料を調べて、それらの関係が何なのかを見ていません.
今日見てみると、それらを使う効果が違うことに気づきました.AndはC++の中の&&と同じように(すべて短絡している)と思っていましたが、Andは短絡していません.AndAlsoは短絡しています.後でAndAlsoを使うべきものはAndAlsoを使うべきで、Andを使うべきものはAndを使うべきだと思いました.
e.g.        Dim i As Int32        Dim s() As String
        i = 0
        If i = 1 AndAlso s(1) = "1"Then            MessageBox.ここまで来るはずがないShow(「AndAlsoは短絡できるだろう」)End If
If i=1 Ands(1)="1"Then'エラーその他の情報:オブジェクト参照がオブジェクトのインスタンスに設定されていません.            MessageBox.ここまで来るはずがないShow(「ここまで来るはずもない」)End If
OrElse類似
以下はMSDNの説明です.
ショート演算子
論理演算子AndAlsoとOrElseは「短絡」と呼ばれる挙動を示す.ショート演算子は、まず左側の式を計算します.左側の式が式全体を偽(AndAlsoで)または検証(OrElseで)した場合、右側の式は計算されずにプログラム実行プロセスが続行されます.次の例を参照してください.
If 45 < 12 AndAlso MyFunction(3) = 81 Then ' Add code to continue execution.

この例では、演算子は左側の式45<12を計算します.この式はFalseとして計算されるため、論理式全体がFalseとして計算されます.したがって、プログラム実行プロセスは、Ifブロック内のコードの実行を開始し、右式MyFunction(3)を計算しない.この例では、左側の式が式全体を偽にするため、MyFunction()は呼び出されません.
同様に、OrElseの論理式の左側の式をTrueとして計算すると、実行プロセスは2番目の式を計算せずに次の行のコードを続行します.1番目の式が式全体を有効にしているためです.
逆に、論理演算子AndとOrを使用する場合、論理演算子の両方が計算されます.たとえば、次の式を考慮します.
If 45 < 12 And MyFunction(3) = 81 Then ' Add code to continue execution.

この例では、最初の式がFalseとして計算された場合でも、MyFunction()を呼び出します.
AndAlso演算子
2つの式に対して簡略化された論理結合を実行します.注記コンパイルされたコードが、ある式の計算結果に基づいて別の式の計算をスキップできる場合、この論理演算を「ショート」と呼びます.最初の式の計算結果が演算の最終結果を決定できる場合は、最終結果が変更されないため、別の式を計算する必要はありません.スキップされた式が複雑であるか、プロシージャ呼び出しに関連している場合、ショートカットはパフォーマンスを向上させることができます.例この例では、AndAlso演算子を使用して2つの式を論理的に結合します.結果は、結合式全体が真であるかどうかを示すBoolean値です.最初の式がFalseの場合、2番目の式は計算されません.Dim A As Integer = 10Dim B As Integer = 8Dim C As Integer = 6Dim myCheck As BooleanmyCheck = A > B AndAlso B > C   ' True.myCheck = B > A AndAlso B > C   ' False. Second expression not evaluated.myCheck = A > B AndAlso C > B   ' False. Second expression evaluated.
Public Function FindValue(ByVal Arr() As Double, _                          ByVal SearchValue As Double) As Double   Dim I As Integer = 0   While I <= UBound(Arr) AndAlso Arr(I) <> SearchValue   ' If I is greater than UBound(Arr), SearchValue is not checked.      I += 1   End While   If I >= UBound(Arr) Then I = –1   Return IEnd Function
OrElse演算子
2つの式に対して短絡論理解析を実行するために使用します.
コメント
コンパイルされたコードが、ある式の計算結果に基づいて別の式の計算をスキップできる場合、この論理演算を短絡と呼びます.最初の式の計算結果が演算の最終結果を決定できる場合は、最終結果が変更されないため、別の式を計算する必要はありません.スキップされた式が複雑であるか、プロシージャ呼び出しに関連している場合、ショートカットはパフォーマンスを向上させることができます.例この例では、OrElse演算子を使用して2つの式に対して論理解析を実行します.結果はBoolean値で、2つの式のうち1つが真であるかどうかを示します.最初の式がTrueの場合、2番目の式は計算されません.Dim A As Integer = 10Dim B As Integer = 8Dim C As Integer = 6Dim myCheck As BooleanmyCheck = A > B OrElse B > C   ' True. Second expression is not evaluated.myCheck = B > A OrElse B > C   ' True. Second expression is evaluated.myCheck = B > A OrElse C > B   ' False.
If MyFunction(5) = True OrElse MyOtherFunction(4) = True Then ' If MyFunction(5) is True, MyOtherFunction(4) is not called.   ' Insert code to be executed.End If
次に、And演算子とOrAnd演算子が2つのBoolean式に対して論理結合を実行するか、2つの数値式に対してビット結合を実行するかを見てみましょう.なお、論理/ビット演算子の優先度は、他の算術演算子および関係演算子の優先度よりも低いため、正確に実行されるように、ビット別演算をかっこで囲む必要があります.オペランドにBoolean式と数値式が含まれている場合、Boolean式は数値(-1はTrue、0はFalse)に変換され、最終的にビット単位の演算が行われます.
Or演算子は、2つのBoolean式に対して論理解析を実行するか、2つの数値に対してビット解析を実行するために使用されます.なお、論理/ビット演算子の優先度は、他の算術演算子および関係演算子の優先度よりも低いため、正確に実行されるように、ビット別演算をかっこで囲む必要があります.オペランドにBoolean式と数値式が含まれている場合、Boolean式は数値(-1はTrue、0はFalse)に変換され、最終的にビット単位の演算が行われます.