问题
This may be stupid.but i have a simple doubt Suppose i have the following check in a function
bool Validate(string a , string b)
{
if(a == null || b == null)
{
throw new NullReferenceException();
}
else
{
}
}
Is it ok to use bitwise OR for validation as shown below
if(a == null | b == null)
回答1:
In boolean expressions (rather than integers etc), the main difference is: short-circuiting. ||
short-circuits. |
does not. In most cases you want short-circuiting, so ||
is much much more common. In your case, it won't matter, so ||
should probably be used as the more expected choice.
The times it matters is:
if(politics.IsCeasefire() | army.LaunchTheRockets()) {
// ...
}
vs:
if(politics.IsCeasefire() || army.LaunchTheRockets()) {
// ...
}
The first always does both (assuming there isn't an exception thrown); the second doesn't launch the rockets if a ceasefire was called.
回答2:
In this case (with bool
arguments) the |
operator is not a bitwise operator. It's just a non-short-circuiting version of the logical or
(||
).
The same goes for &
vs. &&
- it's just a non-short-circuiting version of logical and
.
The difference can be seen with side-effects, for example in
bool Check()
{
Console.WriteLine("Evaluated!");
return true;
}
// Short-circuits, only evaluates the left argument.
if (Check() || Check()) { ... }
// vs.
// No short circuit, evaluates both.
if (Check() | Check()) { ... }
回答3:
This should work, because when used on things that evaluate to bool
, the "bitwise" operators carry out logical operations just the same. You might find it less efficient, though. The logical operators in C# will short-circuit, meaning they'll skip evaluation of the second expression if the answer can be deduced from the first. So in your example, if a == null
turns out to be true, then ||
would return true
immediately, while |
would go ahead and check b == null
anyway.
回答4:
As has been commented upon, the code is indeed 'ok'.
Using the single pipe '|' will evaluate all expressions before returning the result. '||' can be more efficient, since it ceases as soon as an expression evaluates to true.
来源:https://stackoverflow.com/questions/25602131/is-it-ok-to-use-bitwise-operator-in-place-of-a-logical-operator-like-or