首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Object.GetHashCode()的默认实现

Object.GetHashCode()的默认实现
EN

Stack Overflow用户
提问于 2009-04-06 03:25:15
回答 2查看 65.4K关注 0票数 180

GetHashCode()的默认实现是如何工作的?它能有效地处理结构、类、数组等吗?

我正在努力决定在哪些情况下我应该打包自己的包,在哪些情况下我可以安全地依赖默认实现来做得很好。如果可能的话,我不想重复发明轮子。

EN

回答 2

Stack Overflow用户

发布于 2009-04-06 03:42:40

一般来说,如果你要重写Equals,你想重写GetHashCode。这是因为两者都用于比较类/结构的相等性。

当检查Foo A,B时使用Equals;

if (A == B)

因为我们知道指针不太可能匹配,所以我们可以比较内部成员。

Equals(obj o)
{
    if (o == null) return false;
    MyType Foo = o as MyType;
    if (Foo == null) return false;
    if (Foo.Prop1 != this.Prop1) return false;

    return Foo.Prop2 == this.Prop2;
}

哈希表通常使用GetHashCode。对于给定状态的类,类生成的哈希码应该总是相同的。

我通常会这样做,

GetHashCode()
{
    int HashCode = this.GetType().ToString().GetHashCode();
    HashCode ^= this.Prop1.GetHashCode();
    etc.

    return HashCode;
}

有些人会说,哈希码应该在每个对象的生命周期内只计算一次,但我不同意这种说法(我可能错了)。

使用object提供的默认实现,除非您对某个类具有相同的引用,否则它们将不会彼此相等。通过重写Equals和GetHashCode,您可以根据内部值而不是对象引用来报告相等。

票数 2
EN

Stack Overflow用户

发布于 2019-03-20 13:00:06

如果你只是在处理POCOs,你可以使用这个实用程序来简化你的生活:

var hash = HashCodeUtil.GetHashCode(
           poco.Field1,
           poco.Field2,
           ...,
           poco.FieldN);

..。

public static class HashCodeUtil
{
    public static int GetHashCode(params object[] objects)
    {
        int hash = 13;

        foreach (var obj in objects)
        {
            hash = (hash * 7) + (!ReferenceEquals(null, obj) ? obj.GetHashCode() : 0);
        }

        return hash;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/720177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档