覆盖一个类型的Equals和GetHashCode,它有'dibs'?

Onl*_*ere 2 .net c# equals gethashcode

这个问题和Jon的回答让我意识到这甚至存在,所以我很好奇并启动了Visual Studio.


我按照MSDN页面的一个示例,然后创建了我自己的小例子.它如下:

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我有几个问题:

  1. 如果Equals方法在处理我的自定义相等性方面做得很好,为什么我也必须重写GetHashCode方法呢?

  2. 比较下面的内容,使用哪个比较器,Equals或GetHashCode?

.

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();
}
Run Code Online (Sandbox Code Playgroud)
  1. 操作员方法究竟做了什么?它看起来像某种伏都教黑魔法.

Ree*_*sey 7

如果Equals方法在处理我的自定义相等性方面做得很好,为什么我也必须重写GetHashCode方法呢?

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

比较下面的内容,使用哪个比较器,Equals或GetHashCode?

GetHashCode不用于比较 - 仅用于散列操作.始终使用等于.

操作员方法究竟做了什么?它看起来像某种伏都教黑魔法.

这允许您直接==在您的类型的两个实例上使用.如果没有这个,您将通过引用比较您的类型是否为类,而不是类型中的值.