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

我是否必须在新类中覆盖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(对象引用地址)。这意味着test1test2必须引用完全相同的对象,然后只有它返回True,否则,它将返回False。...然后,出现了如何在c#检查等式的问题,答案是覆盖Equals方法的默认实现。 这里是Equals方法的默认实现。...在test2test4,如果FirstNameLastName的值不同,则返回false 重写的Equals方法必须遵循下面的规则: =必须是自反的,也就是x.Equals(x)必须返回true。...not override Object.GetHashCode() 在解释这个问题之前需要先把Equals()GetHashCode()方法进行深入了解。

51520

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

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

20920

C# 之 System.Object

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

43920

如何重写object虚方法

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

78610

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

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

52810

框架设计原则规范(四)

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.4K40

编写高质量代码改善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...理论上来说,我们重写了PersonEquals方法,也就是说在AddAPerson方法的mike和在Main函数的mike属于”值相等“。...将上面代码的两行注释代码去掉,运行程序得到输出 ? 可以发现,AddAPerson方法Main方法的两个mike的HashCode是不同的。

37440

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 关注的主页 本作品采用 知识共享署名-非商业性使用-相同方式共享

67830

4-通用对象操作

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

63560

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

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

72620

.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

41410

NHibernate联合主键详细示例

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

1.5K80

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

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

59920

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

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

1.1K20

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

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

1.7K30

C# 对象哈希码

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

76850
领券