ReferenceEquals(variable,null)与variable == null相同?

时间:2012-10-16 15:29:50

标签: c# reference null

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

感谢。

3 个答案:

答案 0 :(得分:2)

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

有关详细信息和一些历史概述,请参阅this article

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

答案 1 :(得分:2)

直接来自the documentation

  

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