ReferenceEquals(variable, null) 与变量 == null 相同



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

谢谢。

直接来自文档

与 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.
    }
 }

相关内容

  • 没有找到相关文章

最新更新