我遇到了GetHashCode和Equals的问题,我已经为一个类覆盖了.我正在使用operator ==来验证两者是否相等,并且我希望如果它们的哈希码相同,则会调用GetHashCode和Equals以验证它们确实相等.
但令我惊讶的是,没有被调用,并且相等测试的结果是错误的(虽然它实际上应该是真的).
覆盖代码:
public class User : ActiveRecordBase<User> [...] public override int GetHashCode() { return Id; } public override bool Equals(object obj) { User user = (User)obj; if (user == null) { return false; } return user.Id == Id; } }
平等检查:
if (x == y) // x and y are both of the same User class // I'd expect this test to call both GetHashCode and Equals
解决方法
运算符==与.GetHashCode()或.Equals()完全分开.
您可能对Microsoft Guidelines for Overloading Equals() and Operator ==感兴趣.
简短版本是:使用.Equals()来实现相等比较.使用operator ==进行身份比较,或者如果要创建不可变类型(可以认为每个相等的实例实际上相同).此外,.Equals()是一个虚方法,可以被子类覆盖,但operator ==取决于使用它的表达式的编译时类型.
最后,为了保持一致,每次实现.Equals()时都要实现.GetHashCode().重载运算符!=任何时候重载运算符==.