CodeQL 文档

对值类型表达式调用 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

单击以在 CodeQL 代码库中查看查询

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);
    }
}

参考

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