VB.NETでは、And
とAndAlso
の違いは何ですか?どちらを使うべきですか?
And
演算子は両側を評価します。ここで、AndAlso
は、左側がtrueの場合にのみ右側を評価します。
例:
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に等しいかどうかを確認し、両方が真の場合に続行します。
if x = 5 AndAlso y = 7
Xが5に等しいかどうかを確認します。等しくない場合、yが7であるかどうかは確認しません。条件が既にfalseであることがわかっているためです。 (これは短絡と呼ばれます。)
一般に、最初の部分が真ではない場合に明示的に2番目の部分をチェックしない理由がある場合、たとえばチェックした場合に例外をスローするなど、短絡法を使用します。例えば:
If Not Object Is Nothing AndAlso Object.Load()
それがAnd
の代わりにAndAlso
を使用した場合、例外がスローされるnothing
であってもObject.Load()
を試みます。
興味深いことに、VB.NETのAnd
とOr
がビット演算子であるのに、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
注:ゼロ以外の整数はtrue
と見なされます。 Dim e = not 0
はe
を-1
に設定し、Not
もビット演算子であることを示します。
||
および&&
(C#バージョンのOrElse
およびAndAlso
)は、それぞれ3
および5
である最後に評価された式を返します。これにより、C#のイディオムv || 5
を使用して、v
がnull
または(5
と整数)の場合に式の値として0
を指定し、それ以外の場合はv
の値を指定できます。この「デフォルト値のイディオム」はVB.NETで機能しないため、セマンティクスの違いにより、VB.NETに手を出すC#プログラマーが不意を突かれることがあります。
つまり、質問に答えるために:ビット操作(整数またはブール)にはOr
およびAnd
を使用します。 OrElse
およびAndAlso
を使用して、操作を「短絡」して時間を節約するか、評価の前に評価の有効性をテストします。 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を評価します。
副作用は悪であると言うすべての人々のためだけに、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
を消費された行なしで残す場合があります。
もちろん、上記のコードは機能しませんが、私は常にこのような副作用を使用し、「bad」または「evil」のようなコードを考慮しませんあなたを信じさせるでしょう。読みやすく効率的です。
AndAlsoもAndによく似ていますが、C#、C++などで&&のように機能する点が異なります。
違いは、最初の節(AndAlsoの前の節)が真である場合、2番目の節は評価されないことです。複合論理式は「短絡」です。
これは時々非常に便利です。次のような式で
If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then
...
End If
上記の式で古いAndを使用すると、myObjがnullの場合、NullReferenceExceptionがスローされます。
スタックオーバーフローの質問も参照してください:AndAlsoおよびOrElse演算子を常に使用する必要がありますか?。
また、式の右側に必要な副作用がある場合にAnd
を使用して言及した人へのコメント:
右側に必要な副作用がある場合は、「And」を使用するのではなく、左側に移動します。 bothサイドに副作用がある場合にのみ、「And」が本当に必要です。そして、もしあなたがそのような多くの副作用が起こっているなら、おそらく何か他の間違ったことをしているでしょう。一般的に、あなたは本当にAndAlsoを好むべきです。
それについて考える簡単な方法は、より平易な英語を使用することです
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は短絡と呼ばれる調整プロセスを提供します。多くのプログラミング言語には、vb.netのようにこの機能が組み込まれており、不要な評価を除外することで、長い条件ステートメントのパフォーマンスを大幅に向上させることができます。
もう1つの類似した条件は、OrElse条件です。これは、左の条件がfalseの場合にのみ適切な条件をチェックするため、true条件が見つかった後に不要な条件チェックを切り取ります。
常に短絡プロセスを使用し、これによって最も利益が得られる方法で条件文を構成することをお勧めします。たとえば、最も効率的で最速の条件を最初にテストし、絶対に必要なときにのみ長い条件を実行し、他の時間は短絡させます。
私たちの大部分にとって、OrElseとAndAlsoは、いくつかの紛らわしい例外(OrとAndを使用しなければならない場合がある1%未満)を除いて、トリックを行います。
ブール論理を見せびらかし、それをロケット科学のように見せている人々に夢中にならないようにしてください。
それは非常にシンプルで簡単であり、そもそもロジックが気に入らないために、システムが期待どおりに動作しない場合があります。それでも、あなたの脳は、彼の論理が100%テストされ証明されており、機能するはずだとあなたに言い続けています。その瞬間に、あなたの脳を信頼するのをやめて、もう一度考えてもらうよう頼むか、(OrElseでもOrElseでもない)あなたは、あまりロジックを必要としない別の仕事を探すように強制します。