0

所以我在文章中读过==检查对象引用是否相同 .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 所以为什么是假的

4

1 回答 1

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
  }
于 2019-04-27T05:40:43.513 回答