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


回答:


380

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/


2
「詳細」リンクが壊れています。新しいURLは次のとおりです。panopticoncentral.net
2003/08/18

12
代わりに「AndThen」を選択しなかった理由を誰かが知っていますか?これはもっと直感的だと思います。
tmighty 2014

7
これは直感に反すると思っていました。また、両方をチェックすることを意味し、これは逆になります!したがって、なぜ私はこのようなことをチェックするためにSOに来なければならないのですか(そう、私はAC#の人です)。また、「AndとAndAlsoの違い」のような質問をする必要はありません。andsが多すぎます。私の英語の先生は私を殺したでしょう
ロビンフランス語

3
私はOrElseを使用するときはいつでも、サウスパークを「それ以外に」と常に考えています。「その通り」
ロビンフランス語、

1
@tmighty Thenは独自のキーワードであるため、混乱を招くと推測します。
binki

29

Andそれは条件が偽であることを知っている場合Andalso演算子は停止します一方、オペレータは、続行する前に文のすべての条件をチェックします。例えば:

if x = 5 And y = 7

xが5に等しいかどうかをチェックし、yが7に等しい場合は、両方が真であれば続行します。

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例外をスローすることになります。


14
右側に必要な副作用がある場合は、「And」を使用するのではなく、左側に移動します。「And」が本当に必要なのは両側に副作用がある場合だけです。そしてもしあなたが多くの副作用を起こしているなら、あなたはおそらく他の何か間違ったことをしているでしょう。
Joel Coehoorn、2008年

1
まず、Andalsoは主に「実行時に保存」するために使用されていません。第2に、2番目の引数にいくつかの有用な「副作用」を実行させることは、醜悪な悪い習慣です。
Tor Haugen

2
しかし、それが「実行時に節約」しないわけではありません。そして、私は副作用が実際には醜い悪い習慣ではない状況を発見しました。
Ed Marty、

1
「一般に、2番目の部分を明示的にチェックしない理由がある場合、人々は短絡法を使用します。」理由がない限り、ショートサーキットを使って欲しいと思います!誰も古い使用する必要がありますand/をor、私は正当なものは少数&はるかの間にあると考えているの-彼らは理由がない限り。他のほとんどの言語がデフォルトでショートサーキットになる理由は確かにあります。それは結果の意味を保持する一方で、貢献しない可能性のある潜在的に高価な式を評価しません。条件に隠された副作用は、まあ、副次的であるべきです。しかし、それは私の意見です...
underscore_d

20

興味深いことにことを述べた答えのどれAndOrVB.NETには、一方でビット演算子ではない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 0設定eする-1ことNotもビット演算子です。

||及び&&(C#のバージョンOrElseとはAndAlso)になり、最後の評価式を返す35それぞれ。これによりv || 5、C#のイディオムを使用して、is または(および整数)の5場合の式の値とそれ以外の場合の値を与えることができます。この「デフォルト値イディオム」はVB.NETでは機能しないため、セマンティクスの違いにより、VB.NETで油断しているC#プログラマーを捕まえることができます。vnull0v

だから、質問に答えるために利用:Or及びAndビット動作(整数またはブール)のために。OrElseおよびAndAlsoを使用して操作を「短絡」して時間を節約するか、評価の前に評価の有効性をテストします。If valid(evaluation) andalso evaluation thenまたはif not (unsafe(evaluation) orelse (not evaluation)) then

ボーナス:次の価値は何ですか?

Dim e = Not 0 And 3

私はあなたが混乱したと思う||&&??||false以外の値を返す言語はありますが、C#はそれらの1つではなく、aを返しますbool(リフトされたnullable演算子を除き、Nullable<bool>結果が得られます)
Ben Voigt


13

副作用は悪だと言う人すべてのために: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消費ラインなし。

もちろん、上記のコードは機能しませんが、私はいつもこのような副作用を使用しており、「悪い」または「邪悪な」コードだとは思わないでしょう。読みやすく、効率的です。


5

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

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


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

3
英語には仕様がないため、コードよりも混乱します!
binki

5

AndAlsoもAndによく似ていますが、C#やC ++などでは&&のように機能します。

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

これは、たとえば次のような式で非常に役立つことがあります。

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

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


5

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

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

右側に必要な副作用がある場合は、「And」を使用するのではなく、左側に移動します。「And」が本当に必要なのは両側に副作用がある場合だけです。そしてもしあなたが多くの副作用を起こしているなら、あなたはおそらく他の何か間違ったことをしているでしょう。一般的に、AndAlsoを実際に使用する必要があります。


3

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

別の同様の条件は、OrElse条件です。これは、左の条件がfalseの場合にのみ右の条件をチェックするため、真の条件が見つかった後に不要な条件チェックを省略します。

常にショートサーキットプロセスを使用し、これによって最も効果的な方法で条件ステートメントを構成することをお勧めします。たとえば、最も効率的で最速の条件を最初にテストして、絶対に他の時間に短絡させなければならないときにのみ長い条件を実行するようにします。


また、真のコンポーネントと偽のコンポーネントの両方が評価されるため、IIF(Immediate If)は短絡せず、プログラマーの意図とはかなり異なる条件を作成する可能性があるため、言及する価値もあります。以前、誰かがこの副作用の動作を意図的に使用していると述べましたが、-即時イフは私が検出できる方法で評価を行う意図的な意図がないので、私はそれを効果的な方法とは見なしません。
jinzai 2016年

「上記の回答に加えて、AndAlsoは短絡と呼ばれる調整プロセスも提供します。」これ以上の答えはすべて短絡に焦点を当てています。:Pしかし、良い説明と推奨事項。
underscore_d

1

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

ブールロジックを披露してロケットサイエンスのように見せることに夢中にならないようにしてください。

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


0

タラではなく言葉で理解するには:

使用例:
「And」を使用すると、コンパイラはすべての条件をチェックするため、オブジェクトが「Nothing」である可能性があることを確認し、そのプロパティの1つを確認すると、ランタイムエラーが発生します。
ただし、AndAlsoを使用すると、条件の最初の「false」で次の条件がチェックされるため、エラーは発生しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.