【问题标题】:do I need to override Equal?我需要覆盖 Equal 吗?
【发布时间】:2016-01-13 12:10:09
【问题描述】:

我已经阅读了一些关于覆盖 Equal 和 GetHashcode 的内容,但是当我只有一个简单的自己的 Equal 方法时是否需要它?

如果我必须重写它:

这是为什么呢? - 在覆盖 GetHashCode() 时我应该使用 Id.GetHashCode() 吗?

public class Foo {
    public Guid Id { get; } = new Guid();

    public bool Equal(Foo other) {
        if (other == null) return false;
        return Id == other.Id;
    }
}

【问题讨论】:

  • @Muds 但我上面的代码没有覆盖 Equals?这只是一种新方法?
  • 如果没有额外的约定,那么你真的不需要,但我认为没有理由重新发明轮子,特别是因为它不能与所有默认的比较实现结合使用两个实例。

标签: c# overriding


【解决方案1】:

您的代码看起来想要为您的对象实现IEquatable<Foo>。和 MSDN 建议 overeride Object.Equals() 方法:

如果你实现了 IEquatable,你还应该重写基类 Object.Equals(Object) 和 GetHashCode 的类实现,以便 它们的行为与 IEquatable.Equals 的行为一致 方法。如果你确实覆盖了 Object.Equals(Object),你的覆盖 在对静态的调用中也会调用实现 类上的 Equals(System.Object, System.Object) 方法。在 此外,您应该重载 op_Equality 和 op_Inequality 运营商。这可确保所有相等性测试返回一致 结果。

【讨论】:

  • 谢谢。只有一个问题..覆盖 GetHashCode() 时我会返回什么? Id.GetHashCode()?
  • 覆盖 GetHashCode 是另一个不简单的问题。对于具有一个属性的类型,您可以只返回 Id.GetHashCode。另请参阅此问题和答案:stackoverflow.com/questions/263400/…
【解决方案2】:

可以在此处找到另一个指向您的解决方案的指针 - 它解释了您的所有选择 -- please have a read

通常,当类型的对象是 期望被添加到某种集合中,或者当他们的 主要目的是存储一组字段或属性。你可以 将您对价值平等的定义建立在对所有 类型中的字段和属性,或者您可以将定义基于 子集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    相关资源
    最近更新 更多