基本上是标题。我在我正在处理的代码中看到了很多前者,我想知道为什么他们不使用后者。两者之间有什么区别吗?
谢谢。
直接来自文档
与 Equals 方法和相等运算符不同,不能重写 ReferenceEquals 方法。因此,如果要测试两个对象引用的相等性,并且不确定 Equals 方法的实现,则可以调用 ReferenceEquals 方法。但是,请注意,如果 objA 和 objB 是值类型,则在将它们传递给 ReferenceEquals 方法之前,它们将被装箱。
不是真的。一个人可以重载operator ==
,所以你基本上可以让它返回,例如 false
永远。此运算符的推荐用法是表示值相等,因此(对于正确实现的运算符)基本上检查null
如果对象在语义上null
可能返回 true。
有关更多详细信息和一些历史概述,请参阅本文。
另一个区别是,对于值类型ReferenceEquals
没有多大意义:例如,在任何理智的情况下,int 0
的任何两个"实例"都必须被视为相同。(对于纯粹主义者:我加上引号是因为,严格来说,我们不能谈论值类型的实例。
ReferenceEquals()
的主要好处是意图更加清晰,您正在尝试确定两个引用是否相等,而不是引用的对象的内容是否相等。
它通过检查投射到object
的两个引用之间的operator ==
相等性来实现这一点(因为参数都是object
的),这消除了任何可能混淆问题的子类operator ==
重载(如string
)。
所以本质上,这个:
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.
}
}