【问题标题】:What's the difference between obj1.Equals(obj2) and static Object.Equals(obj1, obj2) in c#?c# 中的 obj1.Equals(obj2) 和 static Object.Equals(obj1, obj2) 有什么区别?
【发布时间】:2010-09-13 15:10:58
【问题描述】:

根据 Microsoft 的文档,两种 Equals 方法本质上是相同的。但是我偶然发现了一些非常奇怪的东西。 在我的 Silverlight 项目中,我有两个覆盖 Equals 的相同类的实例。 如果我要求 inst1.Equals(inst2)inst2.Equals(inst1) 我总是得到 true 作为结果。但是 Object.Equals(inst1, inst2) 返回 false。这怎么可能?

有什么想法吗?

谢谢, 罗科

【问题讨论】:

  • 你说“覆盖 Equals”。你能显示覆盖它的代码吗?
  • Object.Equals(inst1, inst2) 在空检查后调用 inst1.Equals(inst2)。邮政编码或它没有发生。

标签: c# iequatable


【解决方案1】:

obj1.Equals 假定 obj1 不是 nullobject.Equals 甚至适用于 null 值。但是,这并不能解释您看到的行为;我认为您应该提供一些代码来重现它以获得更好的答案。

【讨论】:

    【解决方案2】:

    obj1.Equals 可以被覆盖,Object.Equals 不能。换句话说,Object.Equals 是 Equals 方法的基本实现,如果您不覆盖它,您可以免费获得它。由于您确实覆盖了它,因此两种实现方式不同,可能会产生不同的结果。

    【讨论】:

    • 但是如果xy 是不同的(非空)引用,object.Equals(x,y) 会退回到调用x.Equals(y)
    • @LukeH,不错。诅咒我依赖文档而不是反射器。 ;)
    【解决方案3】:

    我认为 Object.Equals 会测试这两个参数是否是同一个引用,即它们指向同一个内存空间。

    MyClass.Equals 可能有不同的实现,这样两个引用不同的类实际上可能相等(基于它们的字段和属性)。

    【讨论】:

    • 没有。这描述了referenceequals。 Equals 使用覆盖。
    • @Mark - 那么abswer是什么?
    【解决方案4】:

    注意正确实现IEquatable<T>。我犯了以下错误:

    public class SubjectDTO: IEquatable<SubjectDTO>
    {
        public string Id;
    
        public bool Equals(SubjectDTO other)
        {
            return Object.Equals(Id, other.Id);
        }
    
        public override int GetHashCode()
        {
            return Id == null ? 1 : Id.GetHashCode();
        }
    }
    

    看起来不错,对吧?但是当你尝试它时,你会发现令人惊讶的结果:

    var a = new SubjectDTO() { Id = "1"};
    var b = new SubjectDTO() { Id = "1"};
    Console.WriteLine(Object.Equals(a, b));
    Console.WriteLine(a.Equals(b));
    
    False
    True
    

    嗯?好吧,忽略Equals(object other)很重要:

    public override bool Equals(object other)
    {
        return other == null ? false : Equals(other as SubjectDTO);
    }
    

    当您将其添加到 SubjectDTO 类时,它将按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-18
      • 2012-07-30
      • 2019-09-05
      • 2013-09-26
      • 1970-01-01
      • 2016-12-13
      • 2018-04-27
      • 1970-01-01
      相关资源
      最近更新 更多