我曾在一次面试中被面试官问到“Object.Equals(object,object)和Object.ReferenceEquals(object,object)之间的区别”。
我在代码片段中尝试过,但结果是相同的。
请提个建议。
A a = new A(), b = new A();
MessageBox.Show(""+Object.Equals(a, b));
MessageBox.Show("" + Object.ReferenceEquals(a, b));发布于 2018-03-07 16:16:04
正如其他人所指出的,只有当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;
}
}现在我们创建两个具有相同姓名和出生日期的Person。根据我们被覆盖的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发布于 2018-03-08 22:43:23
等于是一个接受一个参数(可以为空)的实例方法。因为它是一个实例方法(必须在实际的对象上调用),所以它不能在空引用上调用。
ReferenceEquals是一个接受两个参数的静态方法,这两个参数中的一个/两个都可以为空。因为它是静态的(与对象实例无关),所以它在任何情况下都不会抛出NullReferenceException。
==是一个运算符,在本例中(对象)的行为与ReferenceEquals相同。它也不会抛出NullReferenceException。
举例说明:
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发布于 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仅比较两个对象的引用。只有当两个引用都指向内存中的一个对象时才是真的。
https://stackoverflow.com/questions/34895925
复制相似问题