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