c#中Object.Equals(object,object)和Object.ReferenceEquals(object,object)之间的区别

时间:2016-01-20 09:18:19

标签: c#

面试官在采访中询问了Object.Equals(对象,对象)与Object.ReferenceEquals(对象,对象)之间的区别"。

我在代码段中尝试过,但结果是一样的。

请建议。

A a = new A(), b = new A();
MessageBox.Show(""+Object.Equals(a, b));
MessageBox.Show("" + Object.ReferenceEquals(a, b));

4 个答案:

答案 0 :(得分:3)

Equals 是一个带有一个参数(可以为null)的实例方法。由于它是一个实例方法(必须在实际对象上调用),因此无法在空引用上调用它。

ReferenceEquals 是一个静态方法,它接受两个参数,两个参数都可以为空。由于它是静态的(与对象实例无关),因此在任何情况下都不会抛出NullReferenceException

== 是一个运算符,在这种情况下(对象),其行为与ReferenceEquals相同。它不会抛出NullReferenceExceptioneither

举例说明:

object o1 = null;
object o2 = new object();

//Technically, these should read object.ReferenceEquals for clarity, but this is redundant.
ReferenceEquals(o1, o1); //true
ReferenceEquals(o1, o2); //false
ReferenceEquals(o2, o1); //false
ReferenceEquals(o2, o2); //true

o1.Equals(o1) //NullReferenceException
o1.Equals(o2) //NullReferenceException
o2.Equals(o1) //false
o2.Equals(o2) //true

答案 1 :(得分:1)

的Object.Equals https://msdn.microsoft.com/en-us/library/w4hkze5k(v=vs.110).aspx

Object.ReferenceEquals https://msdn.microsoft.com/en-us/library/system.object.referenceequals(v=vs.110).aspx

根据这个: Object.Equals比较对象的相等性。在它下面调用ReferenceEquals和object.Equals(obj)。

Object.ReferenceEquals仅比较两个对象的引用。只有当两个引用指向内存中的一个对象时才是真的。

答案 2 :(得分:1)

正如其他人所指出的那样,只有在覆盖Equals方法时才会出现差异,因为object中的基础实施依赖于ReferenceEquals

考虑以下示例:

public class Person {
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public DateTime Birthdate { get; set; }

    public override bool Equals(object other) {
        var otherPerson = other as Person;
        if (otherPerson == null) {
            return false;
        }
        return Firstname == otherPerson.Firstname
            && Lastname == otherPerson.Lastname
            && Birthdate == otherPerson.Birthdate;
    }
}

现在我们创建两个具有相同Name和Birthdate的人。根据我们重写的Equals逻辑,这两个被认为是同一个人。但是对于系统来说,这是两个不同的对象,因为它们被实例化了两次,因此引用不相等。

var person1 = new Person(Firstname = "John", Lastname = "Doe", Birthdate = new DateTime(1973, 01, 04));

var person2 = new Person(Firstname = "John", Lastname = "Doe", Birthdate = new DateTime(1973, 01, 04));

bool isSameContent = person1.Equals(person2);         // true
bool isSameObject = person1.ReferenceEquals(person2); // false

var person3 = person1;
bool isSameObject2 = person1.ReferenceEquals(person3); // true

答案 3 :(得分:0)

如果类 A 覆盖方法等于yo可能会有结果差异。 Object.Equals(a,b)使用ReferenceEquals作为比较的第一部分。看这里https://msdn.microsoft.com/en-us/library/w4hkze5k(v=vs.110).aspx