首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我是否必须在新类中覆盖GetHashCode和Equals?

在许多情况下,您需要在自定义类中覆盖 GetHashCodeEquals 方法。这是因为默认情况下,这两个方法是根据对象的引用进行比较的,而不是根据对象的内容进行比较。

如果您希望将对象存储在哈希表中,或者需要比较对象的内容是否相等,那么您需要覆盖 GetHashCodeEquals 方法。

在覆盖 GetHashCode 方法时,您需要确保返回的哈希值是基于对象的内容计算的,并且尽可能地分布均匀。在覆盖 Equals 方法时,您需要确保比较的是对象的内容是否相等,而不是引用是否相等。

以下是一个示例,展示了如何在自定义类中覆盖 GetHashCodeEquals 方法:

代码语言:csharp
复制
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public override int GetHashCode()
    {
        unchecked
        {
            int hashCode = 17;
            hashCode = hashCode * 23 + FirstName.GetHashCode();
            hashCode = hashCode * 23 + LastName.GetHashCode();
            return hashCode;
        }
    }

    public override bool Equals(object obj)
    {
        if (obj == null || GetType() != obj.GetType())
        {
            return false;
        }

        var other = (Person)obj;
        return FirstName == other.FirstName && LastName == other.LastName;
    }
}

在这个示例中,我们覆盖了 GetHashCodeEquals 方法,以便我们可以将 Person 对象存储在哈希表中,并且可以比较它们的内容是否相等。

总之,在许多情况下,您需要在自定义类中覆盖 GetHashCodeEquals 方法,以确保正确地比较对象的内容。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

理解C#语言中相等Equality 和唯一 Identity

c#有一个“Equals”方法,可以用来比较两个对象。我将试着用例子来解释等式和同一性的概念。...这是因为Equals方法的默认实现不检查是否相等;它检查Identity(对象引用地址)。这意味着test1和test2必须引用完全相同的对象,然后只有它返回True,否则,它将返回False。...然后,出现了如何在c#中检查等式的问题,答案是覆盖Equals方法的默认实现。 这里是Equals方法的默认实现。...在test2和test4中,如果FirstName和LastName的值不同,则返回false 重写的Equals方法必须遵循下面的规则: =必须是自反的,也就是x.Equals(x)必须返回true。...not override Object.GetHashCode() 在解释这个问题之前需要先把Equals()和GetHashCode()方法进行深入了解。

53620

Unity3d+c#:Dictionary多个key查找一个value,重载Equals

Equals与GetHashCode System.Object声明方法Equals和GetHashCode以及其他成员。 (注意:这个案例在C#中很重要)。您创建的类型会自动继承这些方法。...Equals的任务是将一个对象与另一个对象进行比较。引用类型的默认实现是比较引用。如果你想改变这种行为,你将不得不重写这个方法。 GetHashCode计算对象的哈希码并用于哈希表。...例如,类型Dictionary和HashSet利用它。 请参阅Hashtable and Dictionary Collection Types。...如果您覆盖Equals,则必须覆盖GetHashCode以保持一致性。...override bool Equals(object obj) 使类的比较为比较里面的成员变量int值 TableData using System; using System.Collections

23120
  • C# 之 System.Object

    大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。 System.Object C#中全部的类都直接或间接继承自System.Object类,这使得C#中的类得以单根继承。...由于全部的类都继承与System.Object,所以这些类都能够訪问该类中受保护的成员和公共的成员。以下我们就一起来看看可使用的成员有哪些。...Equals(object objA,object objB)首先检查两个对象objA和objB是否都为null,假设是则返回true,否则进行objA.Equals(objB)调用并返回其值。...该方法返回true的条件:objA和objB是同一个实例或着objA和objB都是null或者objA.Equals(objB) 3.public virtual int GetHashCode()...适用于哈希算法和诸如哈希表之类的数据结构。 假设两个对象的比較结果相等,则每一个对象的 GetHashCode 方法都必须返回同一个值。

    46620

    如何重写object虚方法

    在 C# 中 Object 是所有类的基类,所有的结构和类都直接或间接的派生自它。...前面这段话可以说所有的 C# 开发人员都知道,但是我相信其中有一部分程序员并不清楚甚至不知道我们常用的 ToString 、 Equals 和 GetHashCode 虚方法都来自于 Object 类,...; 判断哈希码是否相等,这一步需进行短路操作和字段比较; 在基类的 Equals 方法被重写的前提下,必须检查基类的 Equals 方法; 判断关键字段的值是否相等; 重写 GetHashCode 方法...GetHashCode 和 Equals 中引发任何异常; 必须保证对象之间可以随意比较,且不能触发任何异常; 必须实现重写 Equals 、 GetHashCode 、 == 和 !...二、 GetHashCode 在上一小节中我们也注意到在重写 Equals 过程中我们需要重写 GetHashCode 方法。

    79910

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

    2) 要在实现IEquatable.Equals时,同样遵循为覆盖Object.Equals而制定的规范 参见: Object.Equals 3) 要在实现IEquatable的同时覆盖Object.Equals...要在覆盖Equals方法同时覆盖GetHashCode方法 C. 考虑在覆盖Object.Equals方法的同时实现IEquatable接口 D.不要从Equals方法中抛出异常 E....b) 不要为可变的引用类型实现“值相等”语义 2) Object.GetHashCode A.覆盖了Object.Equals就要覆盖GetHashCode方法 B....避免在GetHashCode方法中抛出异常 3) Object.ToString A.要覆盖ToString方法——只要能返回既有用,又易于让人阅读的字符串 开发人员是查看返回的字符串的人员。...考虑将类型中的成员定义为公有的——如果类型会被用于不完全可信的环境 完全可信(full trust)环境中,会对非公有和公有的都进行序列化和反序列化。

    1.5K40

    从系统性能优化谈对象相等性

    C#中自定义类型会从Object类继承Equals和GetHashCode两个方法,可以根据实际需求来重写这两个方法实现对象相等性比较。...Object.Equals(Object) Object 默认实现根据对象在内存中的地址,即引用是否相同来判断对象是否相等。应该说是identity而非equality。...this和obj是不同类型返回false 调用Equals逐字段进行比较 必要时调用基类的Equals方法来比较基类中字段的相等性(通常不调用Object类的Equals) 根据上述思路...上面可以看到,ValueType中Equals实现思路如下: obj==null返回false this和obj为不同类型则返回false 使用反射获取字段信息,然后调用字段的Equals...因此,若使用默认的GetHashCode方法,须注意以下两点: 不能仅通过哈希码来判断对象是否相等 因为对象可以在应用程序域、进程、平台间传递,不要持久化或在生成哈希码的应用程序域之外使用哈希码 下面是微软官方文档中对于

    54110

    编写高质量代码改善C#程序的157个建议

    本文主要学习记录以下内容:   建议10、创建对象时需要考虑是否实现比较器   建议11、区别对待==和Equals   建议12、重写Equals时也要重写GetHashCode 建议10、创建对象时需要考虑是否实现比较器...建议11、区别对待==和Equals  这里我之前有一篇博文针对==和Equals有过专门的介绍,在此就不再进行过多的阐述了http://www.cnblogs.com/aehyok/p/3505000....html 建议12、重写Equals时也要重写GetHashCode  下面先来看一个简单的小例子,定义如下实体类: public class Person { public...理论上来说,我们重写了Person类中的Equals方法,也就是说在AddAPerson方法中的mike和在Main函数中的mike属于”值相等“。...将上面代码中的两行注释代码去掉,运行程序得到输出 ? 可以发现,AddAPerson方法和Main方法中的两个mike的HashCode是不同的。

    39040

    dotnet C# 实现 GetHashCode 的方法

    本文来聊聊在重写某个类的 GetHashCode 方法时,可以如何实现 GetHashCode 的返回值 按照 GetHashCode 方法的原则,要求两个对象如果 Equals 返回 true 那么一定要求...当然,反过来不成立,也就是两个对象返回的 GetHashCode 的值相同,对象可以是不相等的 实现 GetHashCode 方法的方式有很多,最简单的就是通过调用基类的 GetHashCode 方法,...类型的,也就是调用了 object 的 GetHashCode 方法,其实和调用 RuntimeHelpers 的 GetHashCode 方法是相同的,因为在 object 方法里面的 GetHashCode...而 TextImageFile 和 BackgroundImageFile 都是路径字符串,应该忽略大小写,但 Name 属性是区分大小写的,通过 StringComparer 静态类的辅助可以协助计算出值...如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者前往 CSDN 关注我的主页 本作品采用 知识共享署名-非商业性使用-相同方式共享

    74030

    4-通用对象操作

    1.对象的等值性和唯一性 Object的Equals[虚]方法判断两个对象是否相等; Object.ReferenceEquals判断两个对象是否指向同一引用[严格意义上的相等、对象的唯一性]。...2.对象的散列码 Object的GetHashCode[虚]方法返回一个Int32类型的散列码,当重写Equals方法而没有重写GetHashCode方法时编译器会提示一个警告信息。...3.对象克隆 一个类必须自己确定是否允许被克隆,如果允许则应该实现IConeable接口,该接口定义一个方法Clone方法,实现该方法如下: class myConle : ICloneable {...public Object Clone() { //调用Object的受保护方法,实现浅拷贝 //浅拷贝共享对象中包括的应用类型的成员,值类型的成员则不共享;...return MemberwiseClone(); } } 对应深拷贝的话也应该实现此接口,创建一个新对象,初始化相关数据,返回新对象引用。

    64860

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

    这个逻辑比较简单,就是判断null,引用和类型,然后再判断各个属性(字段)的值是否相等。 然后还需要重写object.GetHashCode()方法: ?...派生类 这是上面Citizen类的一个子类: ? 下面我重写object.Equals() 方法: ?...(resharper生成的代码) 这个方法里使用了父类的GetHashCode()方法,把它按位异或IdCard的GetHashCode()的结果。 然后实现==和!=操作符: ?...陷阱 现在我在Citizen这个父类里修改一下==的实现,我想让它更有效率: ? 然后我再执行和上面同样的测试代码,其结果输入是: ? ?,全都相等了。。。。肯定不对。。...所以==操作符重载,可以看作一种方便的语法糖法,同时也把类型不安全的Equals()方法包装了起来。 为什么不实现IEquatable 如果我在Citizen类里面实现了该接口: ?

    74620

    .NET Core开发实战(第27课:定义Entity:区分领域模型的内在逻辑和外在行为)--学习笔记

    27 | 定义Entity:区分领域模型的内在逻辑和外在行为 上一节讲到领域模型分为两层 一层是抽象层,定义了公共的接口和类 另一层就是领域模型的定义层 先看一下抽象层的定义 1、实体接口 IEntity...,也是重载了 Equals 这个方法和 GetHashCode 这个方法 protected static bool EqualOperator(ValueObject left, ValueObject... GetAtomicValues(); 这个方法的作用是将值对象的字段输出出来,作为唯一标识来判断两个对象是否相等,可以看到 Equals 的定义里面也是调用了获取原子值这个方法来判断它是否相等...this.Address = address; } } 它首先实现了 Entity,这一个在上一节已经讲过,另外一个 Order 定义为一个聚合根,它需要实现聚合根接口 IAggregateRoot 实体中字段的...,由领域模型负责赋值 这里面就可以添加一些地址的校验,比如新的地址是否能够与旧的地址距离太远 看一下地址的定义 public class Address : ValueObject { public

    46010

    NHibernate联合主键详细示例

    二、关键步骤 注解如何实现复合主键 根据官方文档说明,联合主键最好是一个独立的类,需要重载Equals和GetHashCode方法,且标记为可序列化。...实现一对 和 多对一的映射 这步没有多大难度,主要处理好注解的顺序即可,以及OneToMany时联合主键如何设置的问题.示例代码如下: [Bag(0, Name = "Childs", Cascade...).GetHashCode(); //判断缓存是否存在,已此作为Key } 插入数据时报错,提示SqlParameterCollection的索引无效[索引溢出错误] 原因,最初在设计Parent的时候...,与联合主键共用了一个字段GroupNumber,导致在NHibernate做映射转换的时候会多计算出一个需要填充的值,但SqlParameterCollection中又少一个位置。...和Equals方法 GetHashCode返回实例的惟一标识 Equals判断是否相同实例的具体实现

    1.5K80

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

    实现步骤 重写object.Equals()方法 实现IEquatable.Equals()接口方法 重写 == 和 !...(如果你使用resharper或者Rider,那么实现该接口的时候它会自动把object的Equals和GetHashCode方法都重写了,并且自动完成了有意义的代码) ?...代码很简单,首先检查是否为null,然后检查这个object是不是一个Person,这里使用了 is 操作符,并把它转型为Person,赋给了一个叫做other的变量。...而类型里拥有GetHashCode()方法(返回Hash)的真正目的是,允许该类型在内部使用HashTable的集合中可以作为Key,因为HashTable需要这些哈希码。...然后其它两个int和DateTime类型,微软都做好了其GetHashCode()的实现。 这里对它们进行异或操作。

    1.2K20

    【《Effective C#》提炼总结】提高Unity中C#代码质量的21条准则

    《Effective C# Second Edition》一书原本有50条原则,但这50条原则是针对C#语言本身以及.NET来写的,我在阅读过程中,发现是有些原则并不适用于Unity中mono版本的C#...原则3 推荐使用is 或as操作符             而不是强制类型转换 ● C#中,is和as操作符的用法概括如下: is : 检查一个对象是否兼容于其他指定的类型,并返回一个Bool值,永远不会抛出异常...● as和is操作符都不会执行任何用户自定义的转换,它们仅当运行时类型符合目标类型时才能转换成功,也不会在转换时创建新的对象。...2)public static bool Equals (object left, object right); 用于判断两个变量的运行时类型是否相等。...对值类型来讲,基类中的实现有时甚至不正确。而且,编写的自己GetHashCode( )也不可能既有效率又正确。

    1.8K30

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

    此 GetHashCode 方法推荐是在重写 Equals 方法时也同时进行重写,要求两个对象在 Equals 返回相等时,两个对象的 GetHashCode 返回值也相等。...反过来则不然,允许有两个不相等的对象的 GetHashCode 是相等的 在重写 Equals 方法时,大部分时候都是自动生成的,如将类里面的所有字段或属性都进行一一比较。...那在 GetHashCode 方法里面,所输出的哈希值的计算,是否也需要使用此类型的所有字段或属性共同计算出来?...} } 假定将此 Foo2 的对象加入到字典里面,接着去判断字典里面是否存在此对象。...} } catch (Exception) { } 本文所有代码放在 github 和

    63220

    C# 对象哈希码

    为此,System.Object提供了GetHashCode,它能获取任何对象的Int32哈希码.如果你定义的类型重写了Equals方法,还应重写GetHashCode方法。...如果你的类型重写了Equals方法,但是没有重写GetHashCode方法,C#编译器会发出一条警告,提示你重写GetHashCode方法,之所以重写Equals方法的同时要求重写GetHashCode...所以重写Equals就必须重写GetHashCode,确保相等性算法和对象哈希码算法一致....所以,需要修改哈西表中的键对象时,正确的做法是移出原来的键值对, 修改键对象,将新的键值对对象添加回哈希表....选择算法来计算类型实例的哈希码时,请遵守一下规则: 1、这个算法要提供良好的随机分布,使哈希表获得最佳的性能 2、可在算法中调用基类的GetHashCode方法,并包含它的返回值,但一般不要调用Object

    80050

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券