gpt4 book ai didi

c# - 警告 : "... overrides Object.Equals(object o) but does not override Object.GetHashCode()"

转载 作者:IT王子 更新时间:2023-10-29 04:25:58 29 4
gpt4 key购买 nike

我覆盖了类的 Equals() 来比较 Guid 类型的 ID 值。

然后 Visual Studio 警告:

... overrides Object.Equals(object o) but does not override Object.GetHashCode()

然后我也像这样覆盖了它的 GetHashCode():

public partial class SomeClass
{
public override bool Equals(Object obj)
{
//Check for null and compare run-time types.
if (obj == null || this.GetType() != obj.GetType()) return false;

return this.Id == ((SomeClass)obj).Id;
}

public override int GetHashCode()
{
return this.Id.GetHashCode();
}
}

这似乎有效。 我做对了吗?记住 Id 是 Guid 类型。 我的类是 Entity Framework 对象重要吗?

最佳答案

正如其他人所说,在 Equals 中使用 Reflection 似乎很狡猾。撇开这个不谈,让我们专注于 GetHashCode。

您不得违反的 GetHashCode 的主要规则是如果两个对象相等,则它们必须具有相同的哈希码。或者,一种等效的说法是,如果两个对象具有不同的哈希码,则它们一定不相等。您的实现看起来不错。

您可以随意违反相反的规定。也就是说,如果两个对象具有相同的哈希码,则允许它们相等或不相等,如您认为合适。

我假设“Id”是一个不可变的属性。如果“Id”可以在对象的整个生命周期内发生变化,那么将对象放入哈希表时就会遇到问题。考虑确保在计算相等性和哈希码时仅使用不可变属性。

您的实现看起来不错,但您问这个问题的事实表明您可能没有充分掌握构建 GetHashCode 实现的所有微妙因素。一个很好的起点是我关于这个主题的文章:

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

关于c# - 警告 : "... overrides Object.Equals(object o) but does not override Object.GetHashCode()",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6470059/

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