我需要覆盖Equal吗?

时间:2016-01-13 12:10:09

标签: c# override

我已经阅读了一些关于覆盖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;
    }
}

2 个答案:

答案 0 :(得分:4)

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

  

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

答案 1 :(得分:1)

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

  

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