基本上是标题。我在我正在处理的代码中看到了很多前者,我想知道他们为什么不使用后者。两者之间有什么区别吗?
谢谢。
并不真地。一个可以超载operator ==
,所以你基本上可以让它返回,例如false
总是。此运算符的推荐用法是表示值相等,因此(对于正确实现的运算符)如果对象是语义上的,则基本上检查null
可能会null
返回 true 。
有关更多详细信息和一些历史概述,请参阅本文。
另一个区别是对于值类型ReferenceEquals
没有多大意义:例如,int 0
在任何正常情况下,任何两个“实例”都必须被认为是相同的。(对于纯粹主义者:我加引号是因为严格来说,我们不能谈论值类型的实例。)
直接来自文档
与 Equals 方法和相等运算符不同,ReferenceEquals 方法不能被覆盖。因此,如果您想测试两个对象引用的相等性并且不确定 Equals 方法的实现,您可以调用 ReferenceEquals 方法。但是,请注意,如果 objA 和 objB 是值类型,则在将它们传递给 ReferenceEquals 方法之前将它们装箱。
的主要好处ReferenceEquals()
是意图更加清晰,您试图确定两个引用是否相等,而不是引用的对象的内容是否相等。
它通过检查转换为operator ==
的两个引用之间的相等性来做到这一点object
(因为参数都是object
),这消除了任何operator ==
可能混淆问题的子类重载(如string
's)。
所以本质上,这个:
if (ReferenceEquals(x, y))
与此相同:
if (((object)x) == ((object)y))
虽然前者更容易阅读。
肯定有它派上用场的时候,特别是当你超载operator ==
自己时避免无限递归:
public class Foo
{
public static bool operator ==(Foo first, Foo second)
{
// can't say if (first == second) here or infinite recursion...
if (ReferenceEquals(first, second))
{
// if same object, obviously same...
return true;
}
// etc.
}
}