首页
学习
活动
专区
圈层
工具
发布

C# - 为值类型重定义相等性

为什么要为值类型重定义相等性 原因主要有以下几点: 值类型默认无法使用 == 操作符,除非对它进行重写 再就是性能原因,因为值类型默认的相等性比较会使用装箱和反射,所以性能很差 根据业务需求,其实际相等性的意义和默认的比较结果可能会不同...(如果你使用resharper或者Rider,那么实现该接口的时候它会自动把object的Equals和GetHashCode方法都重写了,并且自动完成了有意义的代码) ?...这个代码是resharper生成的。...所以如果重写了object.Equals()方法,那么就得重写object.GetHashCode()方法。 看一下resharper自动实现的代码: ?...之所以使用397这个数,可能因为397是一个足够大的质数,可以导致溢出,并混淆各位,之所以使用质数,是因为用质数相乘会得到比用其他任意数相乘更均匀的结果。 检验 ? ? 结果如预期,OK。

1.4K20

dotnet C# 基础 为什么 GetHashCode 推荐只取只读属性或字段做哈希值

在 C# 里面,所有的对象都继承 Object 类型,此类型有开放 GetHashCode 用于给开发者重写。...此 GetHashCode 方法推荐是在重写 Equals 方法时也同时进行重写,要求两个对象在 Equals 返回相等时,两个对象的 GetHashCode 返回值也相等。...如果在 GetHashCode 里面使用的字段或属性非只读,那么 ReSharper 将会警告你这是不安全的。...本文将来告诉大家为什么这是不安全的 在 dotnet 里面,大部分会用到 GetHashCode 的逻辑都在于哈希容器里面,如 Dictionary 字典等。...也许某个逻辑变更了这些非只读字段或属性的时候,影响了 GetHashCode 的返回值从而影响了哈希容器的行为 这就是为什么 ReSharper 警告不要在 GetHashCode 里面使用非只读字段或属性进行制作哈希值的原因

87520
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    原 GetHashCode重写指南(译文)

    我经常遇到重写GetHashCode需要注意事项的问题,因而,我在这里总结一下: GetHashCode的作用 设计仅用于在一个hash表中放置,索引一个对象。...为什么对象需要这样的一个方法 在类型系统中的每个对象都应该提供一个 GetType 的方法, 这是完全合理的。数据自描述能力是 CLR 类型系统的一个关键特性。...但是, 为什么每个对象都要求能在哈希表中插入自己的哈希值呢?要求每一个对象能够做到似乎是一个奇怪的事情。...Security issue:不要把GetHashCode用于其他用途 GetHashCode设计仅用于平衡hash表,不用用作其他用途,特别是: 没有给对象提供唯一键,碰撞几率非常高。...没有进行高度加密,因而不能用于签名或者密码的一部分 它不一定有校验的检错性能。 正确地处理所有这些事情是非常棘手的。

    1.3K60

    超好用的 Visual Studio 2022 扩展插件推荐:生产力必备工具

    这些插件各具特色,覆盖了代码清理、性能优化、数据库建模、文档生成等多个方面,能够显著提升开发者的生产力、优化代码质量并简化工作流程。 1....它的代码分析和重构功能能够帮助团队编写更健壮、更高效的代码,尤其适用于企业级应用开发或需要频繁迭代的项目。 ★不过,由于其功能丰富,ReSharper对系统资源的占用较高,建议在性能较好的设备上使用。...它适用于几乎所有类型的开发场景,特别是需要长期维护的代码库。 3....它通过自动化和可视化工具,显著降低了数据库开发的复杂性,适用于数据驱动型应用程序的开发团队。 4....格式支持 该扩展覆盖了主流图像格式,确保开发者在不同场景下都能灵活使用。 无缝集成 无需离开Visual Studio,开发者即可完成图像优化,大幅提升工作效率。

    3.1K10

    精:C# 泛型集合类List使用总结

    为什么选择使用List,而不是使用Array,或者ArryList 首先要说下数组的局限性 (1) 数组中元素是固定的:类型和数量都必须确定!...当然使用Linq中GoupBy + Select等方法还是可以做到去重的,但是这里说的并不是这些东西,而是直接使用Intersect、Except、Distinct、Union 那么为什么引用类型不能直接比较呢...因此要想比较,先把他的值点出来比较,可以只比较某一个值,也可以是全部 重写Equals() 和 GetHashCode() 为什么要重新呢,因为这些比较方法的内部就是调用者两个方法进行比较的,他们仅适用于值类型的比较...([DisallowNull] Person obj) { return obj.name.GetHashCode() + obj.age.GetHashCode();...() + obj.age.GetHashCode(); //return obj.name.GetHashCode() ^ obj.age.GetHashCode();// 两种写法都可以

    86730

    框架设计原则和规范(四)

    要在覆盖Equals方法同时覆盖GetHashCode方法 C. 考虑在覆盖Object.Equals方法的同时实现IEquatable接口 D.不要从Equals方法中抛出异常 E....b) 不要为可变的引用类型实现“值相等”语义 2) Object.GetHashCode A.覆盖了Object.Equals就要覆盖GetHashCode方法 B....确保任何两个对象,如果Object.Equals返回true,那么它们的GetHashCode方法返回值也相同 C....要竭尽所能的让GetHashCode方法产生随机分布的散列码 D.要确保无论怎么更改对象,GetHashCode都返回完全相同的值 E....避免在GetHashCode方法中抛出异常 3) Object.ToString A.要覆盖ToString方法——只要能返回既有用,又易于让人阅读的字符串 开发人员是查看返回的字符串的人员。

    1.8K40

    .NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(上)

    05 | 依赖注入:良好架构的起点 为什么要使用依赖注入框架 借助依赖注入框架,我们可以轻松管理类之间的依赖,帮助我们在构建应用时遵循设计原则,确保代码的可维护性和可扩展性 ASP.NET Core 的整个架构中...services.AddControllers(); } 在 Controller 里面获取我们的服务 // FromServices 标注的作用是从容器里面获取我们的对象 // 每个对象获取两遍,用于对比每个生命周期获取的对象是什么样子的...()}"); Console.WriteLine($"singleton2:{singleton2.GetHashCode()}"); Console.WriteLine($"transient1...:{transient1.GetHashCode()}"); Console.WriteLine($"transient2:{transient2.GetHashCode()}"); Console.WriteLine...($"scoped1:{scoped1.GetHashCode()}"); Console.WriteLine($"scoped2:{scoped2.GetHashCode()}");

    64110
    领券