不必要的复杂布尔表达式¶
ID: cs/simplifiable-boolean-expression
Kind: problem
Security severity:
Severity: recommendation
Precision: high
Tags:
- readability
- maintainability
Query suites:
- csharp-security-and-quality.qls
有许多布尔表达式模式可以轻松地重写以使其更简单。涉及与布尔字面量进行比较的布尔表达式、以布尔字面量作为结果之一的三元条件表达式、双重否定或否定比较都可以更改为等效且更简单的表达式。
建议¶
如果 A
和 B
是布尔类型的表达式,则可以使用以下所示的重写来简化它们。
表达式 | 简化后的表达式 | |
---|---|---|
A == true | A | |
A != false | A | |
A == false | !A | |
A != true | !A | |
A ? true : B | A || B | |
A ? B : false | A && B | |
A ? B : true | !A || B | |
A ? false : B | !A && B | |
A ? true : false | A | |
A ? false : true | !A | |
!!A | A | |
A && true | A | |
A || false | A |
表达式 | 值 | |
---|---|---|
A && false | false | |
A || true | true | |
A ? true : true | true | |
A ? false : false | false |
表达式 | 简化后的表达式 | |
---|---|---|
!(A == B) | A != B | |
!(A != B) | A == B | |
!(A < B) | A >= B | |
!(A > B) | A <= B | |
!(A <= B) | A > B | |
!(A >= B) | A < B |
示例¶
在以下示例中,属性 Espresso
、Latte
和 Grande
的编写方式很复杂,可以简化。
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;
}