Reputation: 45058
Quick question, of which the quickest and easiest answer may well be to rearrange related code, but let's see...
So I have an If
statement (a piece of code which is a part of a full working solution written in C#) rewritten using VB.NET. I am aware the VB.NET IIf(a, b, c)
method evaluates both b
and a
regardless of the trueness of the first evaluation, but this seems to be the case in my standard construct, too:
If (example Is Nothing Or example.Item IsNot compare.Item) Then
'Proceed
End If
Or, rather, more appropriately:
If (example Is Nothing Or Not example.Item = compare.Item) Then
'Proceed
End If
Here, if example
is Nothing
(null
) then I still get an NullReferenceException
- is this my fault, or is it something I just have to endure at the whim of VB.NET?
Upvotes: 30
Views: 123492
Reputation: 1502286
It's your "fault" in that that's how Or
is defined, so it's the behaviour you should expect:
In a Boolean comparison, the Or operator always evaluates both expressions, which could include making procedure calls. The OrElse Operator (Visual Basic) performs short-circuiting, which means that if expression1 is True, then expression2 is not evaluated.
But you don't have to endure it. You can use OrElse
to get short-circuiting behaviour.
So you probably want:
If (example Is Nothing OrElse Not example.Item = compare.Item) Then
'Proceed
End If
I can't say it reads terribly nicely, but it should work...
Upvotes: 57