3

基本上是标题。我在我正在处理的代码中看到了很多前者,我想知道他们为什么不使用后者。两者之间有什么区别吗?

谢谢。

4

3 回答 3

2

并不真地。一个可以超载operator ==,所以你基本上可以让它返回,例如false总是。此运算符的推荐用法是表示值相等,因此(对于正确实现的运算符)如果对象是语义上的,则基本上检查null 可能会null返回 true 。

有关更多详细信息和一些历史概述,请参阅本文

另一个区别是对于值类型ReferenceEquals没有多大意义:例如,int 0在任何正常情况下,任何两个“实例”都必须被认为是相同的。(对于纯粹主义者:我加引号是因为严格来说,我们不能谈论值类型的实例。)

于 2012-10-16T15:32:41.177 回答
2

直接来自文档

与 Equals 方法和相等运算符不同,ReferenceEquals 方法不能被覆盖。因此,如果您想测试两个对象引用的相等性并且不确定 Equals 方法的实现,您可以调用 ReferenceEquals 方法。但是,请注意,如果 objA 和 objB 是值类型,则在将它们传递给 ReferenceEquals 方法之前将它们装箱。

于 2012-10-16T15:33:34.540 回答
1

的主要好处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.
    }
 }
于 2012-10-16T15:41:24.400 回答