为什么 GetHashCode 位于 Object 类中?

2023-11-27

Why 获取哈希码是对象类的一部分吗?只有一小部分类的对象用作哈希表中的键。当我们希望类的对象作为哈希表中的键时,拥有一个必须实现的单独接口不是更好吗?

MS 团队决定将此方法包含在对象类中,从而使其“随处”可用,肯定是有原因的。


在我看来,这是从 Java 复制的设计错误。

在我的完美世界里:

  • ToString将被重命名ToDebugString适当设定期望
  • Equals and GetHashCode会消失的
  • 会有一个ReferenceEqualityComparer实施IEqualityComparer<T>:目前,其中的 equals 部分很容易,但是如果它被覆盖,则无法获得“原始”哈希码
  • 对象不会有与其关联的监视器:Monitor会有一个构造函数,并且Enter/Exit等将是实例方法。

一般来说,相等(以及散列)会导致继承层次结构出现问题 - 只要您始终可以指定要使用的比较类型(通过IEqualityComparer<T>)并且对象可以实现IEquatable<T>如果他们愿意的话,我不明白为什么应该打开它Object. EqualityComparer<T>.Default如果可以使用参考实现T没有实施IEquatable<T>否则请遵循对象。生活会很愉快。

呃,好吧。当我这样做时,数组协方差是另一个平台错误。如果你想要 C# 中的语言错误,如果你愿意,我可以再开始一次小抱怨;)(到目前为止,它仍然是我最喜欢的语言,但有些事情我希望能以不同的方式完成。)

I've 在博客上谈到了这一点其他地方,顺便说一句。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 GetHashCode 位于 Object 类中? 的相关文章

随机推荐

  • 处理 AWS PHP SDK 2 中的错误

    如果我尝试从 S3 存储桶中获取不存在的对象 Amazon PHP SDK 2 会给我一个非常难看的错误 对我来说很方便 但对最终用户来说毫无意义 E g s3 aws gt get s3 result s3 gt getObject ar
  • JPA Glassfish 数据库更新问题

    我在 Glassfish v3 0 1 上部署了一个应用程序 它从数据库中的表中读取事件 一旦准备好 它会将它们标记为已处理 当尝试调用执行更新的方法时 我收到一个奇怪的错误 我无法解释 Override TransactionAttrib
  • AWS Glue 爬网程序创建分区和文件表

    我有一个非常基本的 s3 设置 我想使用 Athena 对其进行查询 数据全部存储在一个存储桶中 并组织到年 月 日 小时文件夹中 data 2018 01 01 01 file1 json file2 json 02 file3 json
  • 在 Bash 中递归更改文件扩展名

    我想递归地遍历一个目录并更改特定扩展名的所有文件的扩展名 例如 t1 to t2 执行此操作的 bash 命令是什么 Use find name t1 exec bash c mv 1 1 t1 t2 如果你有rename可用然后使用one
  • Python:pysqlite 库不支持 C 扩展加载

    我正在尝试让 Spatialite 与我的 django 应用程序一起使用 但是 我遇到了以下问题 raise ImproperlyConfigured The pysqlite library does not support C ext
  • 当服务器处于无限循环并且客户端停止时会发生什么?

    我试图弄清楚服务器和客户端之间的 交谈 是如何完成的 因此 当服务器生成无限循环时 echoing hello br 例如 当客户停止或点击 返回 时会发生什么 服务器如何知道循环已结束 或者它旁边是否有一个无限的进程 我可以在任何地方阅读
  • AngularJS 中的 ng-repeat 自动对焦

    我使用 ng repeat 获取多个电话号码 div div
  • 既然我们有了 ES6 Promise,还有理由使用 Q 或 BlueBird 这样的 Promise 库吗? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 在 Node js 添加了对 Promise 的原生支持之后 还有理由使用 Q 或 BlueBird 等库吗 例如 如果您正在启动一个新项目 并且假设在该项目中您没有任何使用这些库的依赖项
  • 通过 HTTP 使用 MSMQ。如何解决队列问题?

    我目前正在尝试将 MSMQ 与 C 和 NET 结合使用以实现 IPC 我试图理解它是如何工作的 但我对它很困惑访问 MSMQ 队列时路径名称和格式名称之间的差异 我在以下帖子中发现了一些类似的问题 通过 HTTP 的 MSMQ 调用未到达
  • C++ 未初始化的局部变量

    我有一个功能 VOID GetOSVersion PDWORD major PDWORD minor PDWORD build OSVERSIONINFO osver ZeroMemory osver sizeof OSVERSIONINF
  • 读取android资源文件夹中的CSV文件

    我正在 netbeans 中开发一个 Android 应用程序 我正在尝试使用 opencsv 读取 CSV 文件 当我将文件放入资源文件夹并尝试从那里读取它时 构建时出现错误 提示资源目录无效 我应该在哪里存储 csv 文件 以便每次应用
  • 是我个人的问题,还是 WPF 是一堆数据绑定和自定义 IValueConverters?

    说真的 似乎每次我想让我的 UI 元素相互交谈时 我最终都会编写一个新的自定义 IValueConverter 有人告诉我我做错了 拜托 例子 我希望仅当我的文本框包含有效的 URI 时才启用按钮 太棒了 是时候编写代码了UriIsVali
  • 防止某些字段被 .NET Azure Web Api 中的 PATCH 覆盖

    我正在创建一个带有 NET 后端的 Azure 移动服务 该后端使用 TableController ApiController 的子类 来处理 REST 请求 在我的 PATCH 方法中 我想限制允许更新的字段集 我有一个 Account
  • jQuery 计算子元素数量

    div ul li 29 li li 16 li li 5 li li 8 li li 10 li li 7 li ul div 我想统计一下总数 li 中的元素 div div 使用 jQuery 怎么可能做到这一点 children s
  • 为什么 document.execCommand("paste") 在 Google Chrome 中不起作用?

    我的扩展有问题 我想从剪贴板粘贴数据 到目前为止 我已经得到了这个 function pasteAndGo document execCommand paste alert Pasted 出现警报 但没有粘贴任何内容 我有一种感觉docum
  • 如何使用 Spark DataFrames 查询 JSON 数据列?

    我有一个 Cassandra 表 为简单起见 它看起来像 key text jsonData text blobData blob 我可以使用 Spark 和 Spark cassandra connector 为此创建一个基本数据框架 v
  • 从响应标头中删除“服务器:Apache”

    我想知道如何完全删除 apache 在响应中发送的服务器标头 最初 它显示完整的服务器信息 例如Server Apache Ubuntu 14 04 在响应标头中 但我在某处读到将其添加到 apache2 conf 中 ServerToke
  • 如何将手机与邮箱/密码验证关联?

    我正在尝试创建一个 flutter 应用程序 在其中使用电子邮件 密码创建用户后 将其保存在 firebase 中 然后用户输入发送 OTP 的电话号码 并在验证后登录 我的问题是 当这两个步骤完成后 Firebase 将创建两个单独的帐户
  • 使用 Serde 反序列化对象时,有没有办法省略包装器/根对象?

    我有以下对象 data id 1 name South America countries data id 122 name Brazil capital Brasilia 我想定义两个结构 Continent and Country 省略
  • 为什么 GetHashCode 位于 Object 类中?

    Why 获取哈希码是对象类的一部分吗 只有一小部分类的对象用作哈希表中的键 当我们希望类的对象作为哈希表中的键时 拥有一个必须实现的单独接口不是更好吗 MS 团队决定将此方法包含在对象类中 从而使其 随处 可用 肯定是有原因的 在我看来 这