.equals()和== C#的混淆?

时间:2019-04-27 05:19:54

标签: c# equals-operator referenceequals

所以我在文章中读到==检查对象引用是否相同.equals()检查数据是否相同,但是当我自己编写程序时,感到困惑。

我有一个班级我,我的构造函数中要通过10,20 现在我创建了另一个对象p1和p2

person p = new person(10,20);
person p1;
p1 = p;

person p2=new person(10,20);
Console.WriteLine(p==p1); //true
Console.WriteLine(p.Equals(p1)); //true
Console.WriteLine(object.ReferenceEquals(p,p1)); //true
Console.WriteLine(p == p2); //false
Console.WriteLine(p.Equals(p2)); //false confusion same data
Console.WriteLine(object.ReferenceEquals(p, p2));//false
  

现在我对p.equals(p2)感到困惑,它们都具有相同的数据10,20,所以为什么   错误

1 个答案:

答案 0 :(得分:0)

p.Equals(p1),它将使用对象的Equals方法。

您未实现,它将比较两个对象的地址,如果它在内存中的地址相同,那么它将为真。

请注意p1 = p,p1和p指代内存中的相同地址。

person p2=new person(10,20)将在内存中的不同地址中创建与p对象相同内容的对象

p.Equals(p2)在内存中具有不同的地址,并且没有实现Equals方法,它将返回false。

您可以像这样实现Equals方法

  public override bool Equals(Object obj)
       {
          person p= obj as person;
          if (p == null)
             return false;
          else
             return obj.p1 == p.p1 && obj.p2 = p.p2; // assum your property
       }

并且您也需要实现GetHashCode方法

public override int GetHashCode()
  {
    return this.p1 + this.p2; //sample
  }