新闻中心

C#的GetHashCode和Equals方法是什么?为什么需要同时重写它们?

2025-11-20
浏览次数:
返回列表
必须同时重写Equals和GetHashCode以确保相等性判断与哈希一致性,例如Person类中按Name和Age比较时,若只重写Equals而未重写GetHashCode会导致Dictionary查找失败。

c#的gethashcode和equals方法是什么?为什么需要同时重写它们?

在C#中,GetHashCodeEquals 是定义在 Object 类中的两个方法,用于判断对象是否相等以及支持哈希集合(如 Dictionary、HashSet 等)的高效查找。

Equals 方法的作用

Equals 用于判断两个对象在逻辑上是否“相等”。默认实现是比较引用(即是否指向同一个内存地址),但对值类型或需要按字段比较的类,通常需要重写它来定义“内容相等”。

例如:

public override bool Equals(object obj)
{
    if (obj is Person p)
        return Name == p.Name && Age == p.Age;
    return false;
}

GetHashCode 方法的作用

GetHashCode 返回一个整数,作为对象的哈希码。哈希集合(如 Dictionary 的 key、HashSet)使用这个值快速定位对象。如果两个对象通过 Equals 判断相等,它们的 GetHashCode 必须返回相同的值。

例如:

public override int GetHashCode()
{
    return HashCode.Combine(Name, Age);
}

为什么必须同时重写?

只重写其中一个会破坏“相等性契约”,导致哈希集合行为异常。

十天学会PHP教程 十天学会PHP教程

以前写了十天学会ASP,十天学会ASP.NET什么的,现在想想再写个PHP吧,也算比较全了。 PHP的调试方法我这里就不说了,外面很多文章都有介绍,也有很多不同的组合。我这里暂时是以 Apache web server 和 MY SQL 作为WEB服务器和数据库,在php-4.3.3下的环境做的程序。当然要简单的构建和访问查看数据库 PHPMYADMIN 不可少。

十天学会PHP教程 502 查看详情 十天学会PHP教程
  • 如果你只重写 Equals 而不重写 GetHashCode,两个逻辑相等的对象可能产生不同的哈希码。这样在 Dictionary 中就找不到原本存入的对象。
  • 如果你只重写 GetHashCode 而不重写 Equals,不同对象可能有相同哈希码(哈希碰撞正常),但系统仍会调用 Equals 确认是否真相等。如果不重写,还是用引用比较,结果就不准确。

简单说:Equals 定义“什么算相等”,GetHashCode 提供“快速查找依据”。两者必须保持一致。

实际影响示例

假设你有一个 Person 对象用作 Dictionary 的 key:

var people = new Dictionary();
people.Add(new Person("Alice", 25), "Engineer");

之后想通过一个内容相同的 Person 去取值:

var result = people[new Person("Alice", 25)]; // 报错:key not found

原因:即使内容一样,若未重写 GetHashCode 和 Equals,两个新对象哈希码不同或比较失败,查不到数据。

基本上就这些。只要你在业务中把对象当值来比较,尤其是放进哈希集合,就必须同时重写这两个方法,保证逻辑一致。不复杂但容易忽略。

以上就是C#的GetHashCode和Equals方法是什么?为什么需要同时重写它们?的详细内容,更多请关注其它相关文章!


# 类中  # 网站优化托管工作怎么样  # 北京标准网站优化设计  # 优化网站素材下载软件免费  # 网站建设主题有哪些方法  # seo优化专员问答  # seo-nage  # 北辰网站建设包括什么  # 深圳seo搜索  # 洛阳seo网站优化  # seo站内站  # 迭代  # c#  # 最佳选择  # 如何使用  # 你只  # 而不  # 就不  # 十天  # 遍历  # 重写  # 为什么  # equals方法 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】  Lar*el 8 多关键词数据库搜索优化实践  在J*a中如何隐藏复杂性_使用门面模式组织对象交互  sublime怎么预览Markdown渲染效果_Markdown Preview插件 for sublime教程  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法  PHP中高效并行检查多链接状态的教程  深入理解Go语言中的指针类型:以*string为例  深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  漫蛙漫画登录站点 漫蛙2正版漫画快速访问  HTML空白字符处理机制:渲染、DOM与编码实践  “音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!  高德地图公交到站提醒失败如何解决 高德提醒权限设置  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  Go语言中Map值调用指针接收器方法的限制与应对  J*aScript中针对特定容器内图片动画的实现教程  Python大型XML文件高效流式解析教程  sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  铁路12306的积分有效期是多久_铁路12306积分有效期说明  html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】  Composer如何解决json扩展缺失的错误  12306选座怎么选到商务座_12306商务座选择与配置说明  如何将HTML表格多行数据保存到Google Sheets  126邮箱手机版登录官网2026_126手机邮箱免费入口最新  如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension  飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  c++ 命名空间怎么用 c++ namespace使用指南  小米Civi 4录制视频过暗_小米Civi 4亮度优化  蛙漫官方正版入口 蛙漫网页在线全集免费观看  如何使用Node.js csv 包按条件移除含空字段的CSV记录  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  如何使用 Excel 发布器与 Power BI 分享 Excel 洞察  批改网学生版PC登录 批改网官网登录系统入口  cad如何更改注释性对象的比例_cad注释性比例调整方法  mc.js官网登录入口 mc.js官方登录入口最新版  Go语言中对Map值调用带指针接收者方法:原理与最佳实践  J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明  Lar*el 递归关系中排除指定分支的教程  J*a TimerTask中HashMap意外清空的深层原因与解决方案  照顾宝贝2小游戏免费秒玩入口  Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置  微信网页版扫码登录入口 微信网页版二维码登录入口  126邮箱账号注册 电脑版登录入口  一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化  Excel文件在线转换快速入口 Excel在线格式转换网站  解决Tabulator日期时间排序问题的专业指南  在Qt QML中通过Python字典动态更新TextEdit内容的教程  html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】 

搜索