Is relying on && short-circuiting safe in .NET?

21,792

Solution 1

Yes. In C# && and || are short-circuiting and thus evaluates the right side only if the left side doesn't already determine the result. The operators & and | on the other hand don't short-circuit and always evaluate both sides.

The spec says:

The && and || operators are called the conditional logical operators. They are also called the “shortcircuiting” logical operators.
...
The operation x && y corresponds to the operation x & y, except that y is evaluated only if x is true
...
The operation x && y is evaluated as (bool)x ? (bool)y : false. In other words, x is first evaluated and converted to type bool. Then, if x is true, y is evaluated and converted to type bool, and this becomes the result of the operation. Otherwise, the result of the operation is false.

(C# Language Specification Version 4.0 - 7.12 Conditional logical operators)

One interesting property of && and || is that they are short circuiting even if they don't operate on bools, but types where the user overloaded the operators & or | together with the true and false operator.

The operation x && y is evaluated as T.false((T)x) ? (T)x : T.&((T)x, y), where T.false((T)x) is an invocation of the operator false declared in T, and T.&((T)x, y) is an invocation of the selected operator &. In addition, the value (T)x shall only be evaluated once.

In other words, x is first evaluated and converted to type T and operator false is invoked on the result to determine if x is definitely false.
Then, if x is definitely false, the result of the operation is the value previously computed for x converted to type T.
Otherwise, y is evaluated, and the selected operator & is invoked on the value previously computed for x converted to type T and the value computed for y to produce the result of the operation.

(C# Language Specification Version 4.0 - 7.12.2 User-defined conditional logical operators)

Solution 2

Yes, C# uses logical short-circuiting.

Note that although C# (and some other .NET languages) behave this way, it is a property of the language, not the CLR.

Solution 3

I know I'm late to the party, but in C# 6.0 you can do this too:

if(myObj?.SomeString != null)

Which is the same thing as above.

Also see: What does question mark and dot operator ?. mean in C# 6.0?

Solution 4

Your code is safe - && and || are both short-circuited. You can use non-short-circuited operators & or |, which evaluate both ends, but I really don't see that in much production code.

Solution 5

sure, it's safe on C#, if the first operand is false then the second is never evaluated.

Share:
21,792
patrick
Author by

patrick

Updated on July 05, 2022

Comments

  • patrick
    patrick over 1 year

    Assume myObj is null. Is it safe to write this?

    if(myObj != null && myObj.SomeString != null)
    

    I know some languages won't execute the second expression because the && evaluates to false before the second part is executed.

  • Adam Robinson
    Adam Robinson almost 13 years
    Actually, VB.NET behaves this way when using AndAlso and OrElse, not on And and Or, which is likely what 90% of people always use.
  • Brad
    Brad almost 13 years
    One of those languages that uses short-circuit evaluation here
  • Ilya Kogan
    Ilya Kogan almost 13 years
    @Adam, the question says "I know some languages..."
  • Adam Robinson
    Adam Robinson almost 13 years
    @Ilya Kogan: I guess that means that I should read the question more closely ;)
  • Admin
    Admin almost 13 years
    This is... not exactly wrong, but misleading on so many levels. (1) Curly braces languages is just a small subset of the languages that do this. (2) Reversing the input before parsing it is madness, so about no language does this. (3) Regardless of how it's parsed, short-curcuiting is runtime semantics. (4) See comment to harpo's answer regarding VB - And doesn't short-curcuit, but & doesn't either. (Perhaps 2+3 are because you confuse parsing with something that happens at runtime...)
  • Joe Enos
    Joe Enos almost 13 years
    That last paragraph was a little too interesting...made my head hurt. :)
  • CodesInChaos
    CodesInChaos almost 13 years
    It looks complicated, but it's not that hard. It simply doesn't evaluate the right side if the false operator on the left side returns true and returns the left side instead, and else invokes the custom & operator. So it mimics the short circuiting behavior bools have. The typical application of this is an extended bool that can have a third state. For example you could implement something similar to DBBol or bool? with that.
  • Pedro
    Pedro almost 13 years
    If you were one of the "beautiful people," maybe someone would up-vote your answer.
  • John Grabauskas
    John Grabauskas about 6 years
    Your answer is correct, but not as much detail as CodesInChaos
  • Olivier Jacot-Descombes
    Olivier Jacot-Descombes almost 6 years
    It is also important to note that this not only an implementation detail (which can change at any time) but part of the C# Specification (which will not change in this respect).
  • Stewart
    Stewart almost 4 years
    Essentially, a || b is equivalent to a ? a : b, and a && b is equivalent to a ? b : a, except that a is evaluated only once. This is more noticeable in JavaScript, where operands of arbitrary type can be used. Other languages such as C don't follow this principle - they accept operands of non-boolean types but always return a boolean value.
  • Billy Bob
    Billy Bob over 2 years
    Answer does not answer the question and is a suggestion on syntactic sugar that should be a comment.
  • Drew Delano
    Drew Delano over 2 years
    @BillyBob The answer to OPs original question is yes, and that has been well established by all of the other answers on here. This goes more toward answering "does the example code provided even need short circuiting"
  • Nikola Malešević
    Nikola Malešević about 2 years
    I wish we had &&= and ||= operators.