CodeQL documentation

Unnecessarily complex Boolean expression

ID: cs/simplifiable-boolean-expression
Kind: problem
Security severity: 
Severity: recommendation
Precision: high
Tags:
   - quality
   - maintainability
   - readability
Query suites:
   - csharp-security-and-quality.qls

Click to see the query in the CodeQL repository

There are a number of Boolean expression patterns that can easily be rewritten to make them simpler. Boolean expressions involving comparisons with Boolean literals, ternary conditionals with a Boolean literal as one of the results, double negations, or negated comparisons can all be changed to equivalent and simpler expressions.

Recommendation

If A and B are expressions of Boolean type, you can simplify them using the rewrites shown below.

ExpressionSimplified expression
A == trueA
A != falseA
A == false!A
A != true!A
A ? true : BA || B
A ? B : falseA && B
A ? B : true!A || B
A ? false : B!A && B
A ? true : falseA
A ? false : true!A
!!AA
A && trueA
A || falseA
Some expressions always yield a constant value. If the side-effect in `A` is intended, consider restructuring the code to make this more clear. Otherwise, replace the expression with the constant value as shown below.
ExpressionValue
A && falsefalse
A || truetrue
A ? true : truetrue
A ? false : falsefalse
In addition to the rewrites above, negated comparisons can also be simplified in the following way:
ExpressionSimplified expression
!(A == B)A != B
!(A != B)A == B
!(A < B)A >= B
!(A > B)A <= B
!(A <= B)A > B
!(A >= B)A < B

Example

In the following example, the properties Espresso, Latte, and Grande are written in a complex way and can be simplified.

class Bad
{
    int Size { get; set; }

    bool Espresso => !(Size > 4);
    bool Latte => Espresso == false && Size <= 8;
    bool Grande => Espresso == false ? Latte != true : false;
}

The code below shows the same logic expressed in a simpler and more readable way.

class Good
{
    int Size { get; set; }

    bool Espresso => Size <= 4;
    bool Latte => !Espresso && Size <= 8;
    bool Grande => !Espresso && !Latte;
}

References

  • © GitHub, Inc.
  • Terms
  • Privacy
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy