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