问题
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.
回答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 operationx && y
corresponds to the operationx & y
, except thaty
is evaluated only ifx
istrue
...
The operationx && y
is evaluated as(bool)x ? (bool)y : false
. In other words,x
is first evaluated and converted to typebool
. Then, ifx
istrue
,y
is evaluated and converted to typebool
, and this becomes the result of the operation. Otherwise, the result of the operation isfalse
.
(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 asT.false((T)x) ? (T)x : T.&((T)x, y)
, whereT.false((T)x)
is an invocation of theoperator false
declared inT
, andT.&((T)x
, y) is an invocation of the selectedoperator &
. In addition, the value (T)x shall only be evaluated once.In other words,
x
is first evaluated and converted to typeT
andoperator false
is invoked on the result to determine ifx
is definitelyfalse
.
Then, ifx
is definitelyfalse
, the result of the operation is the value previously computed forx
converted to typeT
.
Otherwise,y
is evaluated, and the selected operator&
is invoked on the value previously computed forx
converted to typeT
and the value computed fory
to produce the result of the operation.
(C# Language Specification Version 4.0 - 7.12.2 User-defined conditional logical operators)
回答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.
回答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?
回答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.
回答5:
sure, it's safe on C#, if the first operand is false then the second is never evaluated.
回答6:
It is perfectly safe. C# is one of those languages.
回答7:
Yes, C# and most languages compute the if sentences from left to right.
VB6 by the way will compute the whole thing, and throw an exception if it's null...
回答8:
an example is
if(strString != null && strString.Length > 0)
This line would cause a null exception if both sides executed.
Interesting side note. The above example is quite a bit faster than the IsNullorEmpty method.
回答9:
In C#, &&
and ||
are short-circuited, meaning that the first condition is evaluated and the rest is ignored if the answer is determined.
In VB.NET, AndAlso
and OrElse
are also short-circuited.
In javaScript, &&
and ||
are short-circuited too.
I mention VB.NET to show that the ugly red-headed step-child of .net also has cool stuff too, sometimes.
I mention javaScript, because if you are doing web development then you probably might also use javaScript.
来源:https://stackoverflow.com/questions/4820610/is-relying-on-short-circuiting-safe-in-net