当前位置:  开发笔记 > 编程语言 > 正文

实体类的GetHashCode()的正确实现是什么?

如何解决《实体类的GetHashCode()的正确实现是什么?》经验,为你挑选了1个好方法。

下面是覆盖实体基类的Object.Equals()的示例实现,应用程序中的所有其他实体都从该实体基类派生.

所有实体类都具有属性Id,它是一个可以为null的int.(它是实体类对应的任何表的主键.)

public override bool Equals(object obj)
        {
            if (obj == null || GetType() != obj.GetType())
                return false;

            if (base.Equals(obj))
                return true;

            return Id.HasValue && ((EntityBase) obj).Id.HasValue &&
                   Id.Value == ((EntityBase) obj).Id.Value;
        }

鉴于Equals()的这种实现,你如何正确实现GetHashCode()?



1> Jon Skeet..:

如果你是从已经覆盖的东西中得到的,那么GetHashCode我将它实现为:

public override int GetHashCode()
{
    unchecked
    {
        int hash = 37;
        hash = hash * 23 + base.GetHashCode();
        hash = hash * 23 + Id.GetHashCode();
        return hash;
    }
}

对于Id.GetHashCode(),Id的空值将返回0.

如果你的类只是派生自Object,我只是返回Id.GetHashCode()- 你希望object.GetHashCode在哈希代码中包含实现,因为它基本上最终成为对象标识.

请注意,如果两个实体都没有Id,则不会返回等式定义true,但是将从两个对象返回相同的哈希码.您可能希望考虑更改您的Equals实施.


对于那些想知道的人,就像我一样:23和37是任意数字,是共同素数.乔恩在这里用类似的答案说:http://www.eggheadcafe.com/software/aspnet/29483139/override-gethashcode.aspx
推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有