加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – GetHashCode应该取决于类型吗?

发布时间:2020-12-16 01:47:13 所属栏目:百科 来源:网络整理
导读:首先,我使用的是描述的GetHashCode算法,here.现在,想象下面的(人为的)示例: class Foo{ public Foo(int intValue,double doubleValue) { this.IntValue = intValue; this.DoubleValue = doubleValue; } public int IntValue { get; private set; } public d
首先,我使用的是描述的GetHashCode算法,here.现在,想象下面的(人为的)示例:

class Foo
{
    public Foo(int intValue,double doubleValue)
    {
        this.IntValue = intValue;
        this.DoubleValue = doubleValue;
    }

    public int IntValue { get; private set; }
    public double DoubleValue { get; private set; }

    public override int GetHashCode()
    {
        unchecked
        {
            int hash = 17;

            hash = hash * 23 + IntValue.GetHashCode();
            hash = hash * 23 + DoubleValue.GetHashCode();
            return hash;
        }

    }
}

class DerivedFoo : Foo
{
    public DerivedFoo(int intValue,double doubleValue)
       : base(intValue,doubleValue)
    {

    }
}

如果我有一个Foo和一个DerivedFoo,每个属性具有相同的值,那么它们将具有相同的哈希码.这意味着我可以拥有HashSet< Foo>或者在Linq中使用Distinct方法,这两个实例将被视为相同.

我可能只是误解了GetHashCode的使用,但我希望这两个实例有不同的哈希码.这是一个无效的期望还是GetHashCode应该在计算中使用类型? (或者DerivedClass是否也会覆盖GetHashCode)?

附:我意识到关于这个主题的SO有很多很多问题,但是我没有发现直接回答这个问题的问题.

解决方法

GetHashCode()不应该保证唯一性(尽管如果尽可能唯一,它有助于提高性能).

GetHashCode()的主要规则是等效对象必须具有相同的哈希代码,但这并不意味着非等效对象不能具有相同的哈希代码.

如果两个对象具有相同的哈希码,则调用Equals()方法以查看它们是否相同.由于类型不同(取决于你如何编码你的Equals过载),它们将不相等,因此它会没问题.

即使您对每种类型都有不同的哈希码算法,仍然总是存在冲突的可能性,因此也需要进行Equals()检查.

现在给出上面的示例,您不实现Equals(),这将使每个对象都不同,无论哈希代码如何,因为对象的Equals()的默认实现是引用相等性检查.

如果还没有,请继续为每个类型重写Equals()(如果你愿意,可以继承你的GetHashCode()实现,或者有新的类型),你可以确保它的类型在声明它们相等之前,compare-to对象是相同的.并确保始终实现Equals()和GetHashCode(),以便:

> Equals()对象必须具有相同的GetHashCode()结果.>具有不同GetHashCode()的对象不能是Equals().

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读