2016-01-13 39 views
1

我读过一些关于重写Equal和GetHashcode的内容,但是当我拥有一个像下面这样简单的自己的Equal方法时,我需要它吗?我是否需要重写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; 
    } 
} 
+0

@Muds但我上面的代码不覆盖等于?这只是一种新方法? – MrProgram

+0

如果没有其他约定,那么您并不需要,但我没有看到重新发明轮子的理由,因为它不会与所有比较两个实例的默认实现结合使用。 – dryman

回答

4

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

如果实现IEquatable,你也应该覆盖的Object.Equals(对象)和GetHashCode的基础 类实现,这样 他们的行为与该IEquatable一致。等于 方法。如果您重写Object.Equals(Object),则在调用类的静态方法 Equals(System.Object,System.Object)时,也会调用您的重写的 实现。在 另外,您应该重载op_Equality和op_Inequality 运算符。这确保了所有相等的测试返回一致的 结果。

+0

谢谢。只有一个问题。重写GetHashCode()时我会返回什么? Id.GetHashCode()? – MrProgram

+1

重写GetHashCode是另一个不是简单的问题。对于只有一个属性的类型,您可以仅返回Id.GetHashCode。另请参阅此问题和有关它的答案:http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode –

1

另一个指针到您的解决方案可以在这里找到 - 这说明了什么都是你的选择 - please have a read

通常情况下,你实现当 预期类型的​​对象被添加到值相等某种类型的集合,或者其主要用途是存储一组字段或属性。您可以使用 将所有 字段和属性的类型中的值相等的定义基于比较,也可以将定义基于 子集。

相关问题