当前位置: 首页 > article >正文

C#中实现值相等(Value Equality)的详细步骤

一、为什么“值相等”是一个需要认真对待的问题在 C# 中相等并不是一个简单的问题。很多开发者认为重写Equals就够了但在真实系统中错误或不完整的相等实现会导致Dictionary/HashSet行为异常对象“看起来相等”但集合中却当作不相等、Equals、Contains行为不一致隐蔽而难以排查的 Bug这背后的原因在于.NET 的相等语义是一个由多个方法和接口共同构成的协作体系而不是单一方法。本文将从底层机制出发给出标准、完整、可复用的实现步骤。二、相等的两种语义引用相等 vs 值相等在 .NET 中存在两种本质不同的“相等”1. 引用相等Reference Equality1object.ReferenceEquals(a, b)判断两个变量是否指向同一对象实例类reference type的默认行为2. 值相等Value Equality判断两个对象的数据内容是否相同由开发者显式定义和实现12345var a newPerson(Tom, 18);var b newPerson(Tom, 18);ReferenceEquals(a, b);// falsea.Equals(b);// true如果实现了值相等三、.NET 相等体系的整体结构实现值相等必须理解以下四个关键成员的职责分工成员角色IEquatableT.Equals(T)类型安全、性能最优的相等判断object.Equals(object)所有 .NET API 的统一入口GetHashCode()哈希集合的基础 / !运算符语法层面的相等判断可选一个正确的值相等实现必须保证这些成员在语义上一致。四、类引用类型实现值相等的标准步骤以下步骤适用于绝大多数引用类型class。Step 1明确“相等”的语义设计阶段首先必须回答一个设计问题哪些字段决定两个对象在业务语义上是“相等”的例如1Person 相等 ⇔ Name 和 Age 都相等这一步没有代码但至关重要。Step 2实现IEquatableT.Equals(T other)核心步骤1234567891011publicsealedclassPerson : IEquatablePerson{publicstringName {get; }publicintAge {get; }publicboolEquals(Person other){if(otherisnull)returnfalse;returnName other.Name Age other.Age;}}为什么这是核心泛型集合HashSetT、DictionaryTKey, TValue优先调用它避免装箱boxing性能优于object.Equals提供类型安全的比较语义IEquatableT 是值相等的主入口。Step 3重写object.Equals(object obj)必须1234publicoverrideboolEquals(objectobj){returnEquals(objasPerson);}为什么必须大量 .NET API 只接受objectobject.Equals(a, b)、非泛型集合依赖它保证所有调用路径的相等逻辑一致规范要求Equals(object) 必须委托给 Equals(T)而不是重复实现逻辑。Step 4重写GetHashCode()必须1234publicoverrideintGetHashCode(){returnHashCode.Combine(Name, Age);}必须遵守的核心约束如果 a.Equals(b) 为 true那么 a.GetHashCode() 必须等于 b.GetHashCode()。否则HashSetT会包含重复元素DictionaryTKey, TValue无法正确查找 key实践建议使用参与相等比较的字段避免使用可变字段不要依赖string.GetHashCode()的持久性Step 5可选但推荐重载 / !运算符123456789publicstaticbooloperator(Person left, Person right){returnobject.Equals(left, right);}publicstaticbooloperator!(Person left, Person right){return!object.Equals(left, right);}说明默认情况下类的比较的是引用重载后可使与值相等语义一致object.Equals已处理所有null情况是最安全的写法五、完整标准实现模板1234567891011121314151617181920212223242526272829publicsealedclassPerson : IEquatablePerson{publicstringName {get; }publicintAge {get; }publicPerson(stringname,intage){Name name;Age age;}publicboolEquals(Person other){if(otherisnull)returnfalse;returnName other.Name Age other.Age;}publicoverrideboolEquals(objectobj) Equals(objasPerson);publicoverrideintGetHashCode() HashCode.Combine(Name, Age);publicstaticbooloperator(Person left, Person right)object.Equals(left, right);publicstaticbooloperator!(Person left, Person right) !object.Equals(left, right);}六、结构体值类型的补充说明struct默认按字段比较但使用反射性能较低推荐同样实现IEquatableT1234567891011121314publicstructPoint : IEquatablePoint{publicintX;publicintY;publicboolEquals(Point other) X other.X Y other.Y;publicoverrideboolEquals(objectobj) objisPoint p Equals(p);publicoverrideintGetHashCode() HashCode.Combine(X, Y);}七、record值相等的语言级支持C# 91publicrecord Person(stringName,intAge);编译器自动生成IEquatableTEquals(object)GetHashCode / !不可变设计对于值对象Value Objectrecord 是首选方案。八、常见错误总结只实现IEquatableT不重写Equals(object)重写Equals但忘记GetHashCode与Equals语义不一致在GetHashCode中使用可变字段在中直接调用left.Equals(right)九、结论

相关文章:

C#中实现值相等(Value Equality)的详细步骤

一、为什么“值相等”是一个需要认真对待的问题在 C# 中,相等并不是一个简单的问题。 很多开发者认为重写 Equals 就够了,但在真实系统中,错误或不完整的相等实现会导致:Dictionary / HashSet 行为异常对象“看起来相等”&#xf…...

LoRA微调实战2026:从零到生产的完整工程指南

为什么2026年LoRA仍然是最重要的微调方法 大模型微调技术日新月异,但LoRA(Low-Rank Adaptation)自2021年提出以来,不仅没有被淘汰,反而在2026年成为工业界微调的主流方法之一。原因很简单:极致的参数效率。…...

Ubuntu 22.04上从零安装UCSF DOCK 6.11:手把手解决依赖与编译的那些坑

Ubuntu 22.04实战:UCSF DOCK 6.11完整安装指南与避坑手册在计算化学和药物发现领域,UCSF DOCK一直是分子对接和虚拟筛选的重要工具。最新发布的6.11版本集成了RDKit功能,为药物描述符计算和分子设计带来了全新可能。本文将带你在Ubuntu 22.04…...

K210开发板固件烧录终极指南:kflash_gui完全使用手册

K210开发板固件烧录终极指南:kflash_gui完全使用手册 【免费下载链接】kflash_gui Cross platform GUI wrapper for kflash.py (download(/burn) tool for k210) 项目地址: https://gitcode.com/gh_mirrors/kf/kflash_gui 你是否正在为K210开发板固件烧录而烦…...

别再让Ubuntu卡成PPT了!手把手教你调整Swap分区大小(从1G到64G实战)

Ubuntu性能优化实战:科学配置Swap分区解决系统卡顿当你在Ubuntu上同时运行多个虚拟机、编译大型项目或处理海量数据时,是否经历过系统突然变得异常缓慢,甚至出现程序无响应的情况?这种"卡成PPT"的体验往往不是物理内存不…...

UnrealPakViewer:深度剖析虚幻引擎资源包的5大可视化分析能力

UnrealPakViewer:深度剖析虚幻引擎资源包的5大可视化分析能力 【免费下载链接】UnrealPakViewer 查看 UE4 Pak 文件的图形化工具,支持 UE4 pak/ucas 文件 项目地址: https://gitcode.com/gh_mirrors/un/UnrealPakViewer UnrealPakViewer是一款专门…...

保姆级教程:在CentOS 7/8上从源码编译安装最新版ProxyChains-ng(含systemd服务配置)

CentOS 7/8源码编译ProxyChains-ng全指南:从构建到系统服务集成对于追求极致控制力的技术爱好者来说,预编译软件包就像黑箱操作——你永远不知道里面被加入了什么。本文将带你深入ProxyChains-ng的构建过程,从源码编译到系统服务集成&#xf…...

终极指南:如何使用qmc-decoder快速解密QQ音乐加密音频文件

终极指南:如何使用qmc-decoder快速解密QQ音乐加密音频文件 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾经从QQ音乐下载了心爱的歌曲,却发…...

kflash_gui:3分钟快速上手K210开发板固件烧录工具

kflash_gui:3分钟快速上手K210开发板固件烧录工具 【免费下载链接】kflash_gui Cross platform GUI wrapper for kflash.py (download(/burn) tool for k210) 项目地址: https://gitcode.com/gh_mirrors/kf/kflash_gui K210开发板固件烧录工具kflash_gui是一…...

VMware Workstation Pro 17免费许可证密钥终极指南:快速搭建专业虚拟化环境

VMware Workstation Pro 17免费许可证密钥终极指南:快速搭建专业虚拟化环境 【免费下载链接】VMware-Workstation-Pro-17-Licence-Keys Free VMware Workstation Pro 17 full license keys. Weve meticulously organized thousands of keys, catering to all major …...

数字主权还是数字枷锁?德国eIDAS钱包的Apple/Google账户依赖之困

数字主权还是数字枷锁?德国eIDAS钱包的Apple/Google账户依赖之困 2025年的深秋,一则来自德国联邦内政部(BMI)的技术文档在开发者社区引发了轩然大波。文档明确指出,即将在德国落地的eIDAS钱包——这个承载着欧盟数字身…...

抖音下载器:3分钟搞定批量下载,效率提升95%的秘密武器

抖音下载器:3分钟搞定批量下载,效率提升95%的秘密武器 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fal…...

runc符号链接挂载漏洞导致容器逃逸的原理与实战防护

1. 这个漏洞不是“理论风险”,而是真实可触发的容器逃逸链你有没有遇到过这样的情况:在调试一个容器化服务时,临时用ln -s /host/path /container/mount建了个符号链接,本意只是方便日志查看或配置共享,结果几分钟后发…...

微信小程序逆向:基于Frida Hook WeChatAppHost.dll解密wxapkg

1. 这不是“破解”,而是一次对微信小程序加载机制的逆向观察WeChatAppHost.dll 是 Windows 版微信客户端中承载小程序运行环境的核心动态链接库,它不对外公开接口,也不提供调试符号,但却是所有小程序资源加载、解密、注入与执行的…...

Postman 401错误排查:Bearer Token认证填法与工程化实践

1. 为什么Postman里总在401门口“卡住”——这不是权限问题,是认证链断了 你点下Send,Postman立刻甩出一个冷冰冰的 401 Unauthorized ,连响应体都懒得给你多写一行。你翻文档、查接口说明、确认账号密码没错,甚至把token复制粘…...

Android APP通信协议逆向:AES+Base64+Protobuf加密还原实战

1. 这不是“破解”,而是对通信协议的工程化还原2021年4月那会儿,我接到一个需求:某智网APP在登录、设备控制、状态上报等关键链路中,所有HTTP/HTTPS请求体和响应体都是密文,看不到明文字段,连基础的接口字段…...

ab、Postman、JMeter并发测试真相:协议层、运行时与系统瓶颈解析

1. 为什么你测出来的“并发”根本不是并发——从一次线上服务雪崩说起上周五下午三点,我们一个核心订单查询接口突然响应时间从80ms飙升到2.3秒,错误率冲到17%,监控大盘一片血红。运维拉出负载曲线,CPU和内存都正常;开…...

超越准确率:基于数据集特性的归一化性能度量设计与实践

1. 项目概述与核心问题在机器学习项目里,评估模型性能是绕不开的一环。我们最熟悉的老朋友——准确率、精确率、F1分数——确实简单直观,拿来跟业务方汇报也容易讲清楚。但干得久了,尤其是在处理一些“非标准”数据集时,你总会隐隐…...

AI专著生成攻略:实测优质AI工具,高效完成20万字专著撰写!

学术专著的核心价值在于其内容的系统性以及逻辑的完整性,但是,这恰恰是写作过程中最具挑战性的部分。与期刊论文只关注某一个具体问题不同,专著要求建立一个完整的框架,涵盖绪论、理论基础、核心研究、应用拓展和结论。这就要求各…...

如何快速实现文档自动化下载:免费浏览器脚本终极指南

如何快速实现文档自动化下载:免费浏览器脚本终极指南 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解…...

机器学习笔记本崩溃深度解析:高频错误类型、根因与实战避坑指南

1. 项目概述与核心价值 在机器学习(ML)项目开发中,尤其是在Jupyter Notebook这类交互式环境中,代码执行到一半突然崩溃,弹出一堆令人费解的红色错误信息,是每个开发者都经历过的“日常”。这些崩溃不仅打断…...

AI专著写作秘籍大公开!实测4款工具,一键生成20万字专著超高效!

学术专著写作难题与AI工具解决方案 对于许多从事学术研究的人来说,撰写学术专著面临的最大挑战,可能就是“有限的时间”与“不断增长的需求”的矛盾。写一本专著通常需要3到5年,甚至更长的周期,而研究者们在日常生活中还需要承担…...

Android Native逆向实战:Frida与IDA协同分析ART内存模型

1. 这不是“游戏外挂开发指南”,而是一次对移动应用安全边界的诚实测绘你打开手机里那个图标是蓝色小鸟、背景是木头和石头的《愤怒的小鸟》——它早已不是2010年那个靠物理引擎惊艳全场的休闲游戏,而是被无数人遗忘在角落、却仍静静躺在旧安卓设备里的“…...

基于MultiFold无分箱反卷积的轻子-喷注方位角不对称性测量

1. 项目概述与核心物理动机在粒子物理的高能前沿,我们常常通过“撞击”基本粒子来窥探其内部结构,深度非弹性散射(DIS)就是其中最经典、最有力的探针之一。想象一下,你用一束极高能量的电子(或正电子&#…...

SHAP值在时间感知研究中的应用:从机器学习预测到认知机制解释

1. 项目概述:当时间感知遇上可解释AI 在认知科学和神经工程领域,时间感知一直是个迷人的谜题。我们如何感知时间的流逝?为什么有时“度日如年”,有时又“光阴似箭”?传统研究多依赖于行为实验和理论模型,但…...

抖音批量下载器终极指南:如何3分钟搞定无损音乐提取与高效素材管理

抖音批量下载器终极指南:如何3分钟搞定无损音乐提取与高效素材管理 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fa…...

如何高效提取Wallpaper Engine资源?RePKG专业工具全解析

如何高效提取Wallpaper Engine资源?RePKG专业工具全解析 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg RePKG是一款专门为Wallpaper Engine用户设计的专业工具&#xf…...

免费Chrome插件:一键保存完整网页的终极解决方案

免费Chrome插件:一键保存完整网页的终极解决方案 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-extension …...

抖音下载神器:3步搞定批量无水印下载,效率提升95%

抖音下载神器:3步搞定批量无水印下载,效率提升95% 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallbac…...

终极资源嗅探指南:猫抓浏览器扩展帮你轻松捕获网页媒体资源

终极资源嗅探指南:猫抓浏览器扩展帮你轻松捕获网页媒体资源 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在当今数字时代&#xff0c…...