8

次の VB.NET の If ステートメントでは、条件が評価される順序は何ですか?

ケース 1:

If ( condition1 AND condition2 AND condition3 )
.
.
End If

ケース 2:

If ( condition1 OR condition2 OR condition3 )
.
.
End If

ケース 3:

If ( condition1 OR condition2 AND condition3  OR condition4)
.
.
End If
4

3 に答える 3

11

VB.Net はすべての条件を評価するため、ここでは順序は重要ではありません。

短絡を使用する場合は、AndAlso および OrElse キーワードを使用します。

于 2009-02-02T08:39:31.403 に答える
9

VB.NET は、C プログラマーの観点からは非常に奇妙な獣です。Gerrie が別の回答で述べたように、3 つの条件はすべて、短絡することなく完全に評価されます。AndAlso と OrElse は、必要に応じて時間を節約できます。

最後のifについては、評価の順序は次のとおりです。

If ((condition1 OR (condition2 AND condition3))  OR condition4)

経験則として、あいまいさがある場合、ブラケットを使用して評価の順序を明示的に指定します。

于 2009-02-02T08:43:25.407 に答える
1

これは、手元の質問に正確に答えているわけではありません。すでに回答されているため、アントンが言及した「OrElse」キーワードを拡張する必要があると感じました。また、それは相対的なものである「AndAlso」です。実際にこれらについての説明が必要です。

'OrElse' と 'AndAlso' は、明示的に順序付けされた評価が必要な場合に役立ちます。

「Or」や「And」とは異なり、すべての式が評価される場合、「OrElse」または「AndAlso」を使用すると、最初の式が目的の値に評価される場合、If ステートメントは残りの式をスキップできます。

次の場合、式の順序は「OrElse」に左から右に適用されますが、前の値の結果に応じて常にすべての式を評価するとは限りません。

if( Expression1 orelse Expression2 orelse Expression3 )

    ' Code...

End If

Expression1 が true の場合、Expression 2 と 3 は無視されます。Expression1 が False の場合、Expression2 が評価され、次に Expression2 が True と評価される場合、Expression3 が評価されます。

If (False OrElse True OrElse False ) then
    ' Expression 1 and 2 are evaluated, Expression 3 is ignored.
End If

If (True OrElse True OrElse True ) then
    ' only Expression 1 is evaluated.
End If

If (True OrElse True OrElse True ) then
    ' only Expression 1 is evaluated.
End If

If (False OrElse False OrElse True ) then
    ' All three expressions are evaluated
End If

「OrElse」の別の使用例:

If( (Object1 is Nothing) OrElse (Object2 is Nothing) OrElse (Object3 is Nothing) ) then 


    ' At least one of the 3 objects is not null, but we dont know which one.
    ' It is possible that all three objects evaluated to null.
    ' If the first object is null, the remaining objects are not evaluated.
    ' if Object1 is not  NULL and Object2 is null then Object3 is not evaluated

Else

   ' None of the objects evaluated to null.

Endif

上記の例は、次の例と同じです。

If(Object1 Is Nothing)

    ' Object 1 is Nothing
    Return True

Else 
    If(Object2 Is Nothing)
        ' Object 2 is Nothing 
        Return True
    Else
        If(Object3 Is Nothing)
            ' Object 3 is Nothing 
            Return True
        Else
            ' One of the objects evaluate to null
            Return False
        End If    
    End If      
End If 

AndALsoキーワードもあります。

' If the first expression evaluates to false, the remaining two expressions are ignored
If( Expression1 AndAlso Expression2 AndAlso Expression3 ) Then ...

次のように使用できます。

If( (Not MyObject is Nothing) AndAlso MyObject.Enabled ) Then ...

   ' The above will not evaluate the 'MyObject.Enabled' if 'MyObject is null (Nothing)'
   ' MyObject.Enabled will ONLY be evaluated if MyObject is not Null.

   ' If we are here, the object is NOT null, and it's Enabled property evaluated to true

Else

  ' If we are here, it is because either the object is null, or it's enabled property evaluated to false;

End If 

「And」とは異なり、「Or」と同様に、- は常にすべての式を評価します。

If( (Not MyObject is Nothing) And MyObject.Enabled ) Then ...

   ' MyObject.Enabled will ALWAYS be evaluated, even if MyObject is NULL,
   ' ---  which will cause an Exception to be thrown if MyObject is Null.

End If 

ただし、順序は「OrElse」と「AndAlso」で影響を与える可能性があるため、上記の例のように、オブジェクトが null である天気の評価を最初に行う必要があります。

'MyObject' が NUll の場合、以下は例外を引き起こします。

Try 
    If( MyObject.Enabled  AndAlso (Not MyObject is Nothing) ) Then ...

       ' This means that first expression MyObject.Enabled Was evaluated  to True, 
       ' Second Expression also Evaluated to True

    Else

       ' This means MyObject.Enabled evaluated to False, thus also meaning the object is not null.
       ' Second Expression "Not MyObject is Nothing" was not evaluated.

    End If 
Catch(e as Exception)

    ' An exception was caused because we attempted to evaluate MyObject.Enabled while MyObject is Nothing, before evaluating Null check against the object.

End Try

2 日間眠らずに過ごした後の午前 5 時 16 分にこれを書いたので、間違いやタイプミスがあればコメントしてください。

于 2013-12-17T03:17:13.277 に答える