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