对值类型表达式调用 ReferenceEquals(…)¶
ID: cs/reference-equality-on-valuetypes
Kind: problem
Security severity:
Severity: error
Precision: high
Tags:
- reliability
- correctness
- external/cwe/cwe-595
Query suites:
- csharp-security-and-quality.qls
Object.ReferenceEquals(...)
方法用于确定两个对象是否是同一个实例。由于该方法采用两个对象作为参数,因此在调用该方法时,值类型将自动装箱到不同的对象中。因此,在比较值类型表达式(包括结构值)时,ReferenceEquals(..)
方法将始终返回 false
。因此,这种检查充其量是无用的,最坏情况下是错误的。
建议¶
考虑是否需要进行相等性测试。如果不需要,则将其删除,否则将其替换为更合适的相等性检查,例如 ==
。
示例¶
在此示例中,程序员尝试比较两个 int
,但由于它们是值类型,因此 ReferenceEquals
方法将始终返回 false。实际上,应该使用 i == j
来比较它们。
class ReferenceEqualsOnValueTypes
{
static void Main(string[] args)
{
int i = 17;
int j = 17;
bool b = ReferenceEquals(i, j);
}
}