2011-12-07 6 views
41

(OrElseとOr)と(AndAlsoとAnd)の違いは何ですか? 彼らのパフォーマンスに違いはありますか? OrElseとAndAlsoを使用していない状況がありますか?(OrElseとOr)と(AndAlsoとAnd) - いつ使用しますか?

+2

の可能複製(http://stackoverflow.com/questions/55013/should-i [私はいつもAndAlsoとOrElse演算子を使用する必要がありますか?]:ここでAndAlsoの劇的な影響を示して簡単なテストであります-always-use-thealso-and-orelse-operators) –

+0

VB.NETを使い始めたばかりです。私はこの特定の質問をするためにオンラインになった。 @aerと、彼らの大きな答えを明確にした多くの人々に感謝します。 – Hardryv

答えて

62

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 

、私はAndAlsoOrElseは、すべてが、1%で使用する正しい演算子であることを発見します! - 副作用である場合があります。

ハッピーコーディング。


評価さから第二の発現を防止する最初の式でスロー例外が、これは驚くべきではない..

4

差が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キーワードだった場合は、両方が評価されます。

10

OrElse/AndAlsoでないビット演算子として、Or/Andを使用することができます。ビットごとの演算は、このようなファイルを示している可能性がありますFileAttributes列挙としてフラグ列挙型の組み合わせの値を含み、読み取り専用とFileAttributes.ReadOnly Or FileAttributes.Hidden

2

@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