web-dev-qa-db-ja.com

VB.NETのAndとAndAlsoの違いは何ですか?

VB.NETでは、AndAndAlsoの違いは何ですか?どちらを使うべきですか?

233
Nakul Chaudhary

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/

361
Nico

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()を試みます。

28
Ed Marty

興味深いことに、VB.NETのAndOrがビット演算子であるのに、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

:ゼロ以外の整数はtrueと見なされます。 Dim e = not 0e-1に設定し、Notもビット演算子であることを示します。

||および&&(C#バージョンのOrElseおよびAndAlso)は、それぞれ3および5である最後に評価された式を返します。これにより、C#のイディオムv || 5を使用して、vnullまたは(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
14
Charles Jacks
If Bool1 And Bool2 Then

Bool1とBool2の両方を評価します

If Bool1 AndAlso Bool2 Then

Bool1がtrueの場合にのみ、Bool2を評価します。

13
Bryan Anderson

副作用は悪であると言うすべての人々のためだけに、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」のようなコードを考慮しませんあなたを信じさせるでしょう。読みやすく効率的です。

12
Ian

AndAlsoもAndによく似ていますが、C#、C++などで&&のように機能する点が異なります。

違いは、最初の節(AndAlsoの前の節)が真である場合、2番目の節は評価されないことです。複合論理式は「短絡」です。

これは時々非常に便利です。次のような式で

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

上記の式で古いAndを使用すると、myObjがnullの場合、NullReferenceExceptionがスローされます。

4
Tor Haugen

スタックオーバーフローの質問も参照してください:AndAlsoおよびOrElse演算子を常に使用する必要がありますか?

また、式の右側に必要な副作用がある場合にAndを使用して言及した人へのコメント:

右側に必要な副作用がある場合は、「And」を使用するのではなく、左側に移動します。 bothサイドに副作用がある場合にのみ、「And」が本当に必要です。そして、もしあなたがそのような多くの副作用が起こっているなら、おそらく何か他の間違ったことをしているでしょう。一般的に、あなたは本当にAndAlsoを好むべきです。

4
Joel Coehoorn

それについて考える簡単な方法は、より平易な英語を使用することです

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


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

上記の回答に加えて、AndAlsoは短絡と呼ばれる調整プロセスを提供します。多くのプログラミング言語には、vb.netのようにこの機能が組み込まれており、不要な評価を除外することで、長い条件ステートメントのパフォーマンスを大幅に向上させることができます。

もう1つの類似した条件は、OrElse条件です。これは、左の条件がfalseの場合にのみ適切な条件をチェックするため、true条件が見つかった後に不要な条件チェックを切り取ります。

常に短絡プロセスを使用し、これによって最も利益が得られる方法で条件文を構成することをお勧めします。たとえば、最も効率的で最速の条件を最初にテストし、絶対に必要なときにのみ長い条件を実行し、他の時間は短絡させます。

2
davidallyoung

私たちの大部分にとって、OrElseとAndAlsoは、いくつかの紛らわしい例外(OrとAndを使用しなければならない場合がある1%未満)を除いて、トリックを行います。

ブール論理を見せびらかし、それをロケット科学のように見せている人々に夢中にならないようにしてください。

それは非常にシンプルで簡単であり、そもそもロジックが気に入らないために、システムが期待どおりに動作しない場合があります。それでも、あなたの脳は、彼の論理が100%テストされ証明されており、機能するはずだとあなたに言い続けています。その瞬間に、あなたの脳を信頼するのをやめて、もう一度考えてもらうよう頼むか、(OrElseでもOrElseでもない)あなたは、あまりロジックを必要としない別の仕事を探すように強制します。

0
Anand