C#GetHashCode / Equals覆盖未调用

前端之家收集整理的这篇文章主要介绍了C#GetHashCode / Equals覆盖未调用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我遇到了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().重载运算符!=任何时候重载运算符==.

原文链接:https://www.f2er.com/c/119402.html

猜你在找的C&C++相关文章