CodeQL 文档

不必要的复杂布尔表达式

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

点击查看 CodeQL 代码库中的查询

有许多布尔表达式模式可以轻松地重写以使其更简单。涉及与布尔字面量进行比较的布尔表达式、以布尔字面量作为结果之一的三元条件表达式、双重否定或否定比较都可以更改为等效且更简单的表达式。

建议

如果 AB 是布尔类型的表达式,则可以使用以下所示的重写来简化它们。

表达式简化后的表达式
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
某些表达式始终产生常量值。如果 `A` 中的副作用是故意的,请考虑重构代码以使其更清晰。否则,请将表达式替换为如下所示的常量值。
表达式
A && falsefalse
A || truetrue
A ? true : truetrue
A ? false : falsefalse
除了上述重写之外,还可以按以下方式简化否定比较
表达式简化后的表达式
!(A == B)A != B
!(A != B)A == B
!(A < B)A >= B
!(A > B)A <= B
!(A <= B)A > B
!(A >= B)A < B

示例

在以下示例中,属性 EspressoLatteGrande 的编写方式很复杂,可以简化。

class Bad
{
    int Size { get; set; }

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

以下代码以更简单、更易读的方式显示了相同的逻辑。

class Good
{
    int Size { get; set; }

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

参考资料

  • ©GitHub, Inc.
  • 条款
  • 隐私