对 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
如果比较的一个或两个操作数的编译类型为 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);
}
}