(OrElseとOr)と(AndAlsoとAnd)の違いは何ですか? 彼らのパフォーマンスに違いはありますか? OrElseとAndAlsoを使用していない状況がありますか?(OrElseとOr)と(AndAlsoとAnd) - いつ使用しますか?
答えて
Or/And
は常には両方 式を評価し、その結果を返します。それらはではなく、の短絡です。
OrElse/AndAlso
は、short-circuitingです。正しい表現は、左の表現だけの評価から結果を決定できない場合にのみ評価されます。 (これは意味:左の式がfalseの場合OrElse
のみ右側の式を評価し、左の式がtrueの場合AndAlso
のみ右側の式を評価します。)
副作用は、式の中で発生しないと仮定すると式は依存性がありません(そして実行オーバーヘッドは無視されます)、それらは同じです。
しかし、多くの場合、式はに依存しています。また、これは(ICK、または副作用!)「高価な」計算を回避するために使用することができる
If list IsNot Nothing AndAlso list.Length > 0 Then .. 'list has stuff
:例えば、我々はリストには、何もせず、複数の要素を持っていたときに何かをしたいです: - うまくいけば、以下
個人的にIf Not Validate(x) OrElse Not ExpensiveValidate(x) Then .. 'not valid
、私はAndAlso
とOrElse
は、すべてが、1%で使用する正しい演算子であることを発見します! - 副作用がである場合があります。
ハッピーコーディング。
評価さから第二の発現を防止する最初の式でスロー例外が、これは驚くべきではない..
差がOrElseとAndAlsoが短絡基づくことです最初の条件が合格しなかった場合、2番目(またはそれ以上)の条件は評価されないことを意味します。これは、条件の1つが他よりも集中している場合に特に便利です。
Or
が(両方の条件が評価)結構です例:第2の条件は
If Name = "Fred" Or Name = "Sam" Then
本当に彼らは
に、次のAndAlso
を評価する方法の周りの問題ではありませんが便利です
If Not SomeObject Is Nothing AndAlso CheckObjectExistsInDatabase(SomeObject) Then
これにより、最初にオブジェクトが設定されているかどうかをチェックできますyが設定されている場合は、データベース(または他のタスク)をチェックします。これが普通のAnd
キーワードだった場合は、両方が評価されます。
OrElse
/AndAlso
でないビット演算子として、Or
/And
を使用することができます。ビットごとの演算は、このようなファイルを示している可能性がありますFileAttributes列挙としてフラグ列挙型の組み合わせの値を含み、読み取り専用とFileAttributes.ReadOnly Or FileAttributes.Hidden
@Gideonによって隠されているの両方 - 誰かがそれを指摘嬉しいです。
Dim tm As New Stopwatch
Const tries As Integer = 123456
Dim z As Integer = 0
Dim s() As String = New String() {"0", "one"}
Debug.WriteLine("AndAlso")
For x As Integer = 0 To s.Length - 1
z = 0
tm.Restart() 'restart the stopwatch
For y As Integer = 0 To tries
If s(x) = x.ToString AndAlso s(x) = y.ToString Then '<<<<<<<<<<
z += 1
End If
Next
tm.Stop()
Debug.WriteLine(x.ToString.PadRight(3, " "c) & z.ToString.PadRight(10, " "c) & tm.Elapsed.ToString)
Next
Debug.WriteLine("And")
For x As Integer = 0 To s.Length - 1
z = 0
tm.Restart() 'restart the stopwatch
For y As Integer = 0 To tries
If s(x) = x.ToString And s(x) = y.ToString Then '<<<<<<<<<<
z += 1
End If
Next
tm.Stop()
Debug.WriteLine(x.ToString.PadRight(3, " "c) & z.ToString.PadRight(10, " "c) & tm.Elapsed.ToString)
Next
の可能複製(http://stackoverflow.com/questions/55013/should-i [私はいつもAndAlsoとOrElse演算子を使用する必要がありますか?]:ここでAndAlsoの劇的な影響を示して簡単なテストであります-always-use-thealso-and-orelse-operators) –
VB.NETを使い始めたばかりです。私はこの特定の質問をするためにオンラインになった。 @aerと、彼らの大きな答えを明確にした多くの人々に感謝します。 – Hardryv