首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c#中Object.Equals(object,object)与Object.ReferenceEquals(object,object)的区别

c#中Object.Equals(object,object)与Object.ReferenceEquals(object,object)的区别
EN

Stack Overflow用户
提问于 2016-01-20 17:18:19
回答 4查看 1.6K关注 0票数 1

我曾在一次面试中被面试官问到“Object.Equals(object,object)和Object.ReferenceEquals(object,object)之间的区别”。

我在代码片段中尝试过,但结果是相同的。

请提个建议。

代码语言:javascript
复制
A a = new A(), b = new A();
MessageBox.Show(""+Object.Equals(a, b));
MessageBox.Show("" + Object.ReferenceEquals(a, b));
EN

回答 4

Stack Overflow用户

发布于 2018-03-07 16:16:04

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

考虑以下示例:

代码语言:javascript
复制
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;
    }
}

现在我们创建两个具有相同姓名和出生日期的Person。根据我们被覆盖的Equals逻辑,这两个被认为是同一个人。但对于系统来说,这是两个不同的对象,因为它们被实例化了两次,因此引用不相等。

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2018-03-08 22:43:23

等于是一个接受一个参数(可以为空)的实例方法。因为它是一个实例方法(必须在实际的对象上调用),所以它不能在空引用上调用。

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

==是一个运算符,在本例中(对象)的行为与ReferenceEquals相同。它也不会抛出NullReferenceException

举例说明:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2016-01-20 18:21:19

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仅比较两个对象的引用。只有当两个引用都指向内存中的一个对象时才是真的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34895925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档