gpt4 book ai didi

c# - 为什么我在个人类(class)上使用字典时不必重写 GetHashCode?

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

它似乎总是不需要做任何事情就“工作”。

我唯一能想到的是每个类都有一种隐藏的静态标识符,Object.GetHashCode 使用它。 (另外,有人知道 Object.GetHashCode 是如何实现的吗?我在 .NET Reflector 中找不到它)

我从未覆盖过 GetHashCode,但我在阅读周围时发现人们说您只需要覆盖 Equals 并为您的应用程序提供自定义相等性检查,所以我想我没问题?

不过我还是想知道魔法是如何运作的=P

最佳答案

It always seems to just "work" without ever having to do anything.

您没有告诉我们您的键是使用值类型还是引用类型。

如果您使用的是值类型,则 Equals 的默认实现和 GetHashCode没问题(Equals 检查字段是否相等,GetHashCode 基于字段(不一定是所有字段!))。如果您使用引用类型,则 Equals 的默认实现和 GetHashCode使用引用相等性,这可能是也可能不是;这取决于你在做什么。

The only thing I can think of is that each class has a hidden sort of static identifier that Object.GetHashCode uses.

没有。对于值类型,默认是基于字段的哈希码,对于引用类型,默认是基于引用的哈希码。

(also, does anyone know how Object.GetHashCode is implemented? I couldn't find it in the .NET Reflector)

这是一个您永远不需要知道也永远不要依赖它的实现细节。它随时可能改变。

I have never overridden GetHashCode but I was reading around and people say you only need to when overriding Equals and providing custom equality checking to your application so I guess I'm fine?

那么,默认相等性适合您吗?如果不是,覆盖 EqualsGetHashCode或实现 IEqualityComparer<T>为你的 T .

I'd still like to know how the magic works, though =P

每个对象都有EqualsGetHashCode .默认实现如下:

  1. 对于值类型,Equals是值(value)平等。
  2. 对于引用类型,Equals是引用相等。
  3. 对于值类型,GetHashCode基于字段(同样,不一定是所有字段!)。
  4. 对于引用类型,GetHashCode基于引用。

如果您使用 Dictionary 的重载不带 IEqualityComparer<T> 的构造函数为你的 T , 它将使用 EqualityComparer<T>.Default .这IEqualityComparer<T>只使用 EqualsGetHashCode .因此,如果您没有覆盖它们,您将获得上面定义的实现。如果您覆盖 EqualsGetHashCode那么这就是EqualityComparer<T>.Default会用。

否则,传递 IEqualityComparer<T> 的自定义实现到 Dictionary 的构造函数.

关于c# - 为什么我在个人类(class)上使用字典时不必重写 GetHashCode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7462955/

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