gpt4 book ai didi

c# - 覆盖具有 'dibs' 的类型的 Equals 和 GetHashCode?

转载 作者:行者123 更新时间:2023-11-30 19:12:52 25 4
gpt4 key购买 nike

This question 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));
}
}

所以我有几个问题:

  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();
}
  1. 运算符方法到底做了什么?它看起来像是某种巫毒魔法。

最佳答案

If the Equals method does a good job at handling my custom equality, why do I have to override the GetHashCode method as well?

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

When comparing something like below, which comparer is used, the Equals or the GetHashCode?

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

What exactly do the operator method do? It looks like some sort of voodoo black magic going on there.

这允许您直接使用 ==在您的类型的两个实例上。否则,如果您的类型是一个类,您将通过引用进行比较,而不是通过您的类型中的值进行比较。

关于c# - 覆盖具有 'dibs' 的类型的 Equals 和 GetHashCode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5608267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com