Quick question here about short-circuiting statements in C#. With an if statement like this:
if (MyObject.MyArray.Count == 0 || MyObject.MyArray[0].SomeValu
Yes,
For AND operations if any of the operand evaluated to false then total expression evaluated to false then there is no need to evaluate remaining expressions, And in case of OR operation if any of the operand evaluated to true then remaining evaluation can be skipped
So by using && or || operator, whole expression can be evaluated to true or false without evaluating all sub expressions.
But consider its side effect also. This article might be helpful to understand short-circuit evaluation in depth with some real world examples.
Yes, it is guaranteed.
http://msdn.microsoft.com/en-us/library/6373h346%28v=VS.80%29.aspx
The conditional-OR operator (||) performs a logical-OR of its bool operands, but only evaluates its second operand if necessary.
Yes, this is guaranteed.
C# Language Specification - 7.11 Conditional logical operators:
The
&&
and||
operators are called the conditional logical operators. They are also called the "short-circuiting" logical operators.
Therefore they will support logical short-circuiting by definition - you can rely on this behavior.
Now it is important to make a distinction between a conditional operator and a logical operator:
|
and a logical AND is &
.Yes, it is guaranteed, but you can still get a null reference exception if MyArray is null (or MyObject for that matter obviously).
I prefer to use the && operator, because you then test a positive (my array contains items), rather than negative (my error does not contain items):
if (MyObject.MyArray.Count > 0 && MyObject.MyArray[0].SomeValue == 0)
{
//....
}
This is also guaranteed to short-circuit.
Just a small observation.
You said this:
Otherwise I'll get a null exception in the second part. (emphases mine)
This isn't true, actually. If short-circuiting weren't guaranteed, you could get an IndexOutOfRangeException
in the second part.
It's still possible you could get a NullReferenceException
, if the first item in your MyArray
object is actually null (or if any of the other objects in that expression are).
The only totally safe check would be this:
bool conditionHolds =
MyObject == null ||
MyObject.MyArray == null ||
MyObject.MyArray.Count == 0 ||
MyObject.MyArray[0] == null ||
MyObject.MyArray[0].SomeValue == 0;
if (conditionHolds)
{
//....
}