【问题标题】:confusion for .equals() and == C#? [duplicate].equals() 和 == C# 的混淆? [复制]
【发布时间】:2019-09-16 13:14:33
【问题描述】:

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

【问题讨论】:

  • 因为你没有实现; Equals()覆盖,==覆盖,也没有实现IEquatable接口,所以它们是不同的对象,所以它们不能相等。
  • == 检查两个实例是否是同一个引用(也就是说,它们或多或少指向内存中的同一个对象)。 Equals 检查内容。但是要让Equals 处理自定义类型,您必须重写它。否则它会退回到Object.Equals,它当然不知道自定义类型的属性。
  • 如果是这种情况,那么为什么 (p.Equals(p1));是真的 ? @derpirscher
  • 我不知道Object.Equals 的确切实现,但它可能会检查引用相等,这当然也意味着相等
  • @derpirscher 您不需要知道确切的实现,因为该方法 Object.Equals 有据可查。如果是引用类型,则 Equals 与 ReferenceEquals 相同

标签: c# equals-operator referenceequals


【解决方案1】:

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
  }

【讨论】:

  • p.Equals(p1) 为真,但 p.Equals(p2) 在没有覆盖方法的情况下为假
  • @HienNguyen - 如果你 override bool Equals 你也必须 override int GetHashCode()
  • 感谢 Enigmativity,我更新了答案,请删除否决票 :)
  • 但 stringbuilder 也是参考类型,如果我创建 2 个具有相同数据的字符串构建器,我/e 测试并说 s1.equals(s2)-->true //因为它检查数据@HienNguyen跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多