CodeQL 文档

对 System.Object 进行引用相等性测试

ID: cs/reference-equality-with-object
Kind: problem
Security severity: 
Severity: warning
Precision: medium
Tags:
   - reliability
   - correctness
   - external/cwe/cwe-595
Query suites:
   - csharp-security-and-quality.qls

点击查看 CodeQL 仓库中的查询

如果比较的一个或两个操作数的编译类型为 System.Object 或接口类型,则将执行引用比较。这通常不是我们想要的,尤其是在其中一个操作数的运行时类型声明了 operator== 时。

需要注意的是,对只读常量的比较是一个例外 - 在这种情况下,引用比较更有可能是故意的。

建议

确保引用比较确实是正确的比较方法。如果不是,请选择更合适的比较方法。如果确实需要进行引用比较,请使用 ReferenceEquals 代替,以提高清晰度。

示例

在此示例中,控制台将输出“False”,因为执行的是引用比较,而不是使用在 AlwaysEqual 中重载的 == 运算符。

class ObjectComparison
{
    class AlwaysEqual
    {
        public static bool operator ==(AlwaysEqual a, AlwaysEqual b)
        {
            return true;
        }
        public static bool operator !=(AlwaysEqual a, AlwaysEqual b)
        {
            return false;
        }
    }
    public static void Main(string[] args)
    {
        object a = new AlwaysEqual();
        AlwaysEqual b = new AlwaysEqual();
        Console.WriteLine(a == b);
    }
}

参考

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