我在c#中编写了以下代码:
public class Person
{
private string idNumber;
private string personName;
public Person(string name, string id)
{
this.personName= name;
this.idNumber= id;
}
public override bool Equals(Objectobj)
{
Person personObj= obj as Person;
if(personObj== null)
return false;
else
return idNumber.Equals(personObj.idNumber);
}
public override int GetHashCode()
{
return this.idNumber.GetHashCode();
}
}
public static void Main()
{
Person p1 = new Person("John", "63412895");
Person p2 = new Person("Jack", "63412895");
Console.WriteLine(p1.Equals(p2));
Console.WriteLine(Object.Equals(p1, p2));
}
我不明白为什么第二个Console.WriteLine()
会返回真的???
第一个返回true,因为我覆盖了相等的方法。
但第二个与对象类相等。
请解释一下。
答案 0 :(得分:5)
静态object.Equals
方法定义为
public static bool Equals(Object objA, Object objB)
{
if (objA==objB) {
return true;
}
if (objA==null || objB==null) {
return false;
}
return objA.Equals(objB);
}
所以内部它在Equals
检查后使用覆盖null
。
要比较引用,请使用object.ReferenceEquals
或转换为object
并使用==
运算符。
object.ReferenceEquals(p1, p2)
(object)p1 == (object)p2
答案 1 :(得分:2)
引自Object.Equals(Object, Object)
如果两个对象不表示相同的对象引用和 既不是null,它调用objA.Equals(objB)并返回结果。 这意味着如果objA重写Object.Equals(Object)方法, 调用此覆盖。
我相信您的方案中正是发生了什么。由于您已覆盖Equals
方法,因此Object
的静态方法会在内部调用它。
答案 2 :(得分:1)
第二行代码在内部检查p1是否为null并调用第一行。
所以你不能期望有不同的结果调用几乎相同的方法。
p1.Equals(p2);
Object.Equals(p1, p2);
答案 3 :(得分:-1)
我认为这与您还覆盖Object.Equals使用的GetHashcode这一事实有关。这是我的猜测。
答案 4 :(得分:-1)
你覆盖了GetHashCode。这就是对象平等所使用的。经典的例子是.Net中的两个对象objStringA =“MyVal”和ObjStringB ='MyVal'将返回相等,因为字符串会覆盖get哈希码。
就像你把它翻了两次。我不确定您是否需要在您的情况下覆盖Equals运算符。