VB.NETでは、違いは何であるAnd
とはAndAlso
?どちらを使用すればよいですか?
VB.NETでは、違いは何であるAnd
とはAndAlso
?どちらを使用すればよいですか?
回答:
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/
Then
は独自のキーワードであるため、混乱を招くと推測します。
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
例外をスローすることになります。
and
/をor
、私は正当なものは少数&はるかの間にあると考えているの-彼らは理由がない限り。他のほとんどの言語がデフォルトでショートサーキットになる理由は確かにあります。それは結果の意味を保持する一方で、貢献しない可能性のある潜在的に高価な式を評価しません。条件に隠された副作用は、まあ、副次的であるべきです。しかし、それは私の意見です...
興味深いことにことを述べた答えのどれAnd
とOr
VB.NETには、一方でビット演算子ではない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
それぞれ。これによりv || 5
、C#のイディオムを使用して、is または(および整数)の5
場合の式の値とそれ以外の場合の値を与えることができます。この「デフォルト値イディオム」はVB.NETでは機能しないため、セマンティクスの違いにより、VB.NETで油断しているC#プログラマーを捕まえることができます。v
null
0
v
だから、質問に答えるために利用: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>
結果が得られます)
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がスローされます。
スタックオーバーフローの質問も参照してください:常にAndAlsoおよびOrElse演算子を使用する必要がありますか?。
またAnd
、式の右側に必要な副作用があるかどうかを使用して言及した人へのコメント:
右側に必要な副作用がある場合は、「And」を使用するのではなく、左側に移動します。「And」が本当に必要なのは、両側に副作用がある場合だけです。そしてもしあなたが多くの副作用を起こしているなら、あなたはおそらく他の何か間違ったことをしているでしょう。一般的に、AndAlsoを実際に使用する必要があります。
上記の回答に加えて、AndAlsoは短絡と呼ばれる調整プロセスを提供します。多くのプログラミング言語には、vb.netのようにこの機能が組み込まれており、不要な評価を省略して、長い条件ステートメントでパフォーマンスを大幅に向上させることができます。
別の同様の条件は、OrElse条件です。これは、左の条件がfalseの場合にのみ右の条件をチェックするため、真の条件が見つかった後に不要な条件チェックを省略します。
常にショートサーキットプロセスを使用し、これによって最も効果的な方法で条件ステートメントを構成することをお勧めします。たとえば、最も効率的で最速の条件を最初にテストして、絶対に他の時間に短絡させなければならないときにのみ長い条件を実行するようにします。
私たちの大多数にとって、OrElseとAndAlsoは、いくつかの紛らわしい例外(OrとAndを使用しなければならない可能性がある1%未満)を除いて、トリックを実行します。
ブールロジックを披露してロケットサイエンスのように見せることに夢中にならないようにしてください。
それは非常にシンプルで簡単です。そもそもロジックが気に入らないため、システムが期待どおりに動作しない場合があります。それでも、あなたの脳は彼のロジックが100%テストされ証明されており、それが機能するはずだと言い続けます。その瞬間、あなたの脳を信頼するのをやめて、もう一度考えるように頼むか、または(OrElseまたはOrElseではなく)あなたは自分に多くの論理を必要としない別の仕事を探すように強制します。