面试官在采访中询问了Object.Equals(对象,对象)与Object.ReferenceEquals(对象,对象)之间的区别"。
我在代码段中尝试过,但结果是一样的。
请建议。
A a = new A(), b = new A();
MessageBox.Show(""+Object.Equals(a, b));
MessageBox.Show("" + Object.ReferenceEquals(a, b));
答案 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