And
VB.NET では、との違いは何AndAlso
ですか? どちらを使用する必要がありますか?
12 に答える
演算子はAnd
両側をAndAlso
評価し、 where は左側が真の場合にのみ右側を評価します。
例:
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 演算子は条件が false であることがわかっている場合は停止します。例えば:
if x = 5 And y = 7
x が 5 に等しいかどうかを確認し、y が 7 に等しい場合は、両方が true の場合に続行します。
if x = 5 AndAlso y = 7
x が 5 に等しいかどうかを確認します。そうでない場合は、条件が既に false であることを知っているため、y が 7 であるかどうかを確認しません。(これを短絡といいます。)
一般に、チェックすると例外がスローされる場合など、最初の部分が true でない場合に 2 番目の部分を明示的にチェックしない理由がある場合、短絡メソッドが使用されます。例えば:
If Not Object Is Nothing AndAlso Object.Load()
And
それがの代わりに使用された場合、それがであったとしても例外をスローAndAlso
しようとします。Object.Load()
nothing
If Bool1 And Bool2 Then
Bool1 と Bool2 の両方を評価します
If Bool1 AndAlso Bool2 Then
Bool1 が true の場合にのみ、Bool2 を評価します。
副作用は悪であると言うすべての人々のために: 1 つの状態で 2 つの副作用を持つことが良い場所は、2 つのファイル オブジェクトを並行して読み取ることです。
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 の場合、2 番目の句は評価されないことです。つまり、複合論理式は「短絡」されます。
これは、次のような式で非常に便利な場合があります。
If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then
...
End If
上記の式で古い And を使用すると、myObj が null の場合に NullReferenceException がスローされます。
それについて考える簡単な方法は、より平易な英語を使用することです
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 および OrElse 演算子を常に使用する必要がありますか? .
And
また:式の右側に必要な副作用がある場合の使用について言及した人へのコメント:
右側に必要な副作用がある場合は、「And」を使用するのではなく、左側に移動してください。両側に副作用がある場合にのみ、「And」が必要です。そして、これほど多くの副作用が起こっている場合は、おそらく別のことをしている可能性があります. 一般に、AndAls を使用することをお勧めします。
タラではなく言葉で理解するには:
ユースケース:
「And」を使用すると、コンパイラはすべての条件をチェックするため、オブジェクトが「Nothing」である可能性があることをチェックし、そのプロパティの 1 つをチェックすると、実行時エラーが発生します。
しかし、条件の最初の「false」で AndAlso を使用すると、次の条件がチェックされるため、エラーは発生しません。