为什么 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 类中? 的相关文章

  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • strlen() 编译时优化

    前几天我发现你可以找到编译时strlen使用这样的东西 template
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • Selenium - C# - Webdriver - 无法找到元素

    在 C 中使用 selenium 我试图打开浏览器 导航到 Google 并找到文本搜索字段 我尝试下面的 IWebDriver driver new InternetExplorerDriver C driver Navigate GoT
  • 链接 .Net 程序集

    这都是假设 所以请耐心等待 假设我正在用 C 编写一个名为 Foo 的工具 输出是 foo exe 我发现了一些我喜欢使用的非常棒的库 称为 Bar 我可以在我的项目中将其引用为 bar dll 当我构建项目时 我的输出目录中有 foo e
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • Guid.NewGuid().GetHashCode() 用于数据库

    这对于用作数据存储 SQL Server 的 ID 可靠吗 我会使用 guid 但我更喜欢数字值 A guid更有可能代表一个记录uniquely than a numeric value 随着 GUID 确保全球唯一性 GUID 可以跨数
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • 条件类型定义

    如果我有一小段这样的代码 template
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K

随机推荐

  • 处理 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 团队决定将此方法包含在对象类中 从而使其 随处 可用 肯定是有原因的 在我看来 这