比较相同的值¶
ID: cs/comparison-of-identical-expressions
Kind: problem
Security severity:
Severity: warning
Precision: high
Tags:
- reliability
Query suites:
- csharp-security-and-quality.qls
如果比较两个相同的表达式(即,检查它们是否相等或不相等),这通常表示存在错误,因为比较的布尔值始终相同。通常,这表示在字段访问中使用了错误的限定符。
浮点变量与其自身的不等性(!=
)和相等性(==
)测试适用以下例外情况:特殊的浮点值 NaN
(“非数字”)是唯一不被视为与其自身相等的值。因此,测试 x != x
(其中 x
是 float
或 double
变量)等效于检查 x
是否为 NaN
,x == x
也是如此。
建议¶
将值与其自身进行比较绝非好习惯。如果需要常量行为,请使用布尔值字面量 true
和 false
,而不是将其模糊地编码为 1 == 1
或类似形式。
如果故意对浮点变量与其自身进行不等性测试(使用 !=
),则为了提高可读性,应将其替换为 double.IsNaN(...)
或 float.IsNaN(...)
。同样,如果故意对浮点变量与其自身进行相等性测试(使用 ==
),则应将其替换为 !double.IsNaN(...)
或 !float.IsNaN(...)
。
示例¶
在此示例中,开发人员显然打算将 age 与 personObj.age
进行比较,但实际上是将 age 与自身进行了比较。
class Person
{
private string name;
private int age;
public Person(string name, int age)
{
this.name = name;
this.age = age;
}
public override bool Equals(object obj)
{
Person personObj = obj as Person;
if (personObj == null)
{
return false;
}
return name == personObj.name && age == age; // BAD
}
}
参考¶
MSDN,C# 参考,编译器警告(级别 3)CS1718。
MSDN,C# 参考,Single.NaN 字段。
MSDN,C# 参考,Double.NaN 字段。