首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写类型的等于和GetHashCode,其中有'dibs'?

重写类型的等于和GetHashCode,其中有'dibs'?
EN

Stack Overflow用户
提问于 2011-04-09 22:08:46
回答 4查看 2.3K关注 0票数 2

This question和乔恩的回答让我意识到这一点甚至存在,所以我开始好奇并启动了Visual。

我遵循了MSDN页面的一个示例,然后创建了我自己的小示例。其内容如下:

代码语言:javascript
复制
public class Person : IEquatable<Person>
{
    public string IdNumber { get; set; }
    public string Name { get; set; }

    public bool Equals(Person otherPerson)
    {
        if (IdNumber == otherPerson.IdNumber)
            return true;
        else
            return false;
    }

    public override bool Equals(object obj)
    {
        if (obj == null) 
            return base.Equals(obj);

        if (!(obj is Person))
            throw new InvalidCastException("The Object isn't of Type Person.");
        else
            return Equals(obj as Person);
    }

    public override int GetHashCode()
    {
        return IdNumber.GetHashCode();
    }

    public static bool operator ==(Person person1, Person person2)
    {
        return person1.Equals(person2);
    }

    public static bool operator !=(Person person1, Person person2)
    {
        return (!person1.Equals(person2));
    }
}

所以我有几个问题:

如果

  1. 方法在处理自定义等式方面做得很好,那么为什么我也必须重写GetHashCode方法?在比较下面这样的情况时,
  2. ,使用的是哪一个比较器,等于还是GetHashCode?

代码语言:javascript
复制
static void Main(string[] args)
{
    Person sergio = new Person() { IdNumber = "1", Name = "Sergio" };
    Person lucille = new Person() { IdNumber = "2", Name = "Lucille" };

    List<Person> people = new List<Person>(){
        sergio,
        lucille
    };

    Person lucille2 = new Person() { IdNumber = "2", Name = "Lucille" };
    if (people.Contains(lucille2))
    {
        Console.WriteLine("Already exists.");
    }

    Console.ReadKey();
}

  1. 操作符方法到底是做什么的?看上去像是某种巫毒黑魔法在那里发生着。--
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-09 22:14:52

如果

方法在处理自定义等式方面做得很好,那么为什么还要重写GetHashCode方法呢?

这允许您的类型在通过散列方式工作的集合中使用,例如作为Dictionary<T, U>中的键,或者存储在HashSet<T>中。

在比较下面这样的东西时,使用的是哪个比较器,等于还是GetHashCode?

GetHashCode不用于比较--仅用于哈希操作。等价物总是被使用。

运算符方法到底是做什么的?看上去像是某种巫毒黑魔法在那里发生。

这允许您在两个类型的实例上直接使用==。没有这种情况,如果您的类型是类,那么您将根据引用进行比较,而不是根据类型内的值进行比较。

票数 7
EN

Stack Overflow用户

发布于 2011-04-09 22:15:10

GetHashCode的目的是为了平衡哈希表,而不是确定相等性。当查找哈希表的一个成员时,检查的哈希桶由哈希代码确定,然后由相等性决定对象是否在桶中。这就是为什么GetHashCode必须同意平等。

有关此主题的详细信息,请参阅我的文章:

http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/

票数 3
EN

Stack Overflow用户

发布于 2011-04-09 22:14:07

GetHashCode和Equals是两件非常不同的事情。Equals决定了平等。GetHashCode返回适合哈希映射的哈希代码,但不保证相等。因此,在平等问题上,Equals将是确定平等的方法。

GetHashCode用于哈希集,例如Dictionary。在字典中查找项时,您将匹配哈希代码上的条目,然后在Equals上匹配条目。

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

https://stackoverflow.com/questions/5608267

复制
相关文章

相似问题

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