C#常考随笔3:对象比较obj1.Equals(obj2)== true时候,hashcode是否相同?

一般情况下是相同的,但在自定义类型中,重写了Equals方法,就可能不同。

Equals:

1. 首先,关于Equals方法:

Equals 方法最初定义在 Object 类中,所有的类都直接或间接地继承自 Object 类,因此所有对象都可以调用该方法。Object 类中的 Equals 方法默认比较的是对象的引用是否相等,即判断两个变量是否指向内存中的同一个对象实例。

示例代码

using System;

class Program
{
    static void Main()
    {
        object obj1 = new object();
        object obj2 = obj1;
        object obj3 = new object();

        Console.WriteLine(obj1.Equals(obj2)); // 输出: True,因为 obj1 和 obj2 引用同一个对象
        Console.WriteLine(obj1.Equals(obj3)); // 输出: False,因为 obj1 和 obj3 引用不同的对象
    }
}

2. 重写 Equals 方法

许多类会重写 Equals 方法,以便根据对象的内容来判断它们是否相等,而不仅仅是比较引用。例如,string 类就重写了 Equals 方法,用于比较两个字符串的内容是否相同。

示例代码

using System;

class Program
{
    static void Main()
    {
        string str1 = "hello";
        string str2 = "hello";

        Console.WriteLine(str1.Equals(str2)); // 输出: True,因为 str1 和 str2 的内容相同
    }
}

3. 自定义类重写 Equals 方法

当创建自定义类时,如果需要根据对象的属性来判断对象是否相等,就需要重写 Equals 方法。同时,为了遵循最佳实践,还应该重写 GetHashCode 方法,因为相等的对象应该具有相同的哈希码。

示例代码

using System;

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

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

        Person other = (Person)obj;
        return Name == other.Name && Age == other.Age;
    }

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

class Program
{
    static void Main()
    {
        Person person1 = new Person { Name = "Alice", Age = 25 };
        Person person2 = new Person { Name = "Alice", Age = 25 };

        Console.WriteLine(person1.Equals(person2)); // 输出: True,因为两个对象的属性值相同
    }
}

 什么时候hascode同,什么时候不同

以下是一个符合正常规则的示例:

using System;

class Program
{
    static void Main()
    {
        string x = "hello";
        string y = "hello";

        bool areEqual = x.Equals(y);
        int hashCodeX = x.GetHashCode();
        int hashCodeY = y.GetHashCode();

        Console.WriteLine($"Are equal: {areEqual}");
        Console.WriteLine($"Hash code of x: {hashCodeX}");
        Console.WriteLine($"Hash code of y: {hashCodeY}");
        Console.WriteLine($"Hash codes are equal: {hashCodeX == hashCodeY}");
    }
}

在上述代码中,x 和 y 是两个值相同的字符串对象,它们通过 Equals 方法比较返回 true,并且它们的哈希码也是相同的。

特殊情况

如果在自定义类型中,手动重写了 Equals 方法和 GetHashCode 方法,并且没有遵循 “相等对象具有相同哈希码” 的原则,就可以让两个通过 Equals 方法比较相等的对象具有不同的哈希码。但这种做法是不推荐的,因为它会破坏很多基于哈希码的集合类的正常工作。

以下是一个错误示范的示例:

using System;

class MyClass
{
    public int Value { get; set; }

    public MyClass(int value)
    {
        Value = value;
    }

    public override bool Equals(object obj)
    {
        if (obj is MyClass other)
        {
            return this.Value == other.Value;
        }
        return false;
    }

    public override int GetHashCode()
    {
        // 故意返回不同的哈希码
        return new Random().Next();
    }
}

class Program
{
    static void Main()
    {
        MyClass x = new MyClass(10);
        MyClass y = new MyClass(10);

        bool areEqual = x.Equals(y);
        int hashCodeX = x.GetHashCode();
        int hashCodeY = y.GetHashCode();

        Console.WriteLine($"Are equal: {areEqual}");
        Console.WriteLine($"Hash code of x: {hashCodeX}");
        Console.WriteLine($"Hash code of y: {hashCodeY}");
        Console.WriteLine($"Hash codes are equal: {hashCodeX == hashCodeY}");
    }
}

在这个示例中,MyClass 类重写了 Equals 方法和 GetHashCode 方法,Equals 方法根据 Value 属性判断两个对象是否相等,但 GetHashCode 方法返回一个随机数,这就导致两个相等的对象可能具有不同的哈希码。需要修改:

public override int GetHashCode()
{
    return HashCode.Combine(Value);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/962403.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从0开始,来看看怎么去linux排查Java程序故障

一,前提准备 最基本前提:你需要有liunx环境,如果没有请参考其它文献在自己得到local建立一个虚拟机去进行测试。 有了虚拟机之后,你还需要安装jdk和配置环境变量 1. 安装JDK(以OpenJDK 17为例) 下载JDK…

MFC开发,给对话框添加垂直滚动条并解决鼠标滚动响应的问题

无论在使用QT或者MFC进行界面开发时,都会出现在一个对话框里面存在好多的选项,导致对话框变得非常长或者非常大,就会显现的不美观,在这种情况下通常是添加一个页面的滚动条来解决这个问题,下面我们就来介绍给MFC的对话…

(二)QT——按钮小程序

目录 前言 按钮小程序 1、步骤 2、代码示例 3、多个按钮 ①信号与槽的一对一 ②多对一(多个信号连接到同一个槽) ③一对多(一个信号连接到多个槽) 结论 前言 按钮小程序 Qt 按钮程序通常包含 三个核心文件: m…

QT简单实现验证码(字符)

0) 运行结果 1) 生成随机字符串 Qt主要通过QRandomGenerator类来生成随机数。在此之前的版本中,qrand()函数也常被使用,但从Qt 5.10起,推荐使用更现代化的QRandomGenerator类。 在头文件添加void generateRandomNumb…

受击反馈HitReact、死亡效果Death Dissolve、Floating伤害值Text(末尾附 客户端RPC )

受击反馈HitReact 设置角色受击标签 (GameplayTag基本了解待补充) 角色监听标签并设置移动速度 创建一个受击技能,并应用GE 实现设置角色的受击蒙太奇动画 实现角色受击时播放蒙太奇动画,为了保证通用性,将其设置为一个函数,并…

C++,STL 命名空间:理解 std 的作用、规范与陷阱

文章目录 引言一、为什么需要 std 命名空间?二、std 命名空间的组成三、使用 std 命名空间的正确姿势1. 显式作用域限定2. 谨慎使用 using 声明3. 头文件中禁止 using namespace std 四、常见陷阱与解决方案陷阱 1:与第三方库命名冲突陷阱 2:…

第11章:根据 ShuffleNet V2 迁移学习医学图像分类任务:甲状腺结节检测

目录 1. Shufflenet V2 2. 甲状腺结节检测 2.1 数据集 2.2 训练参数 2.3 训练结果 2.4 可视化网页推理 3. 下载 1. Shufflenet V2 shufflenet v2 论文中提出衡量轻量级网络的性能不能仅仅依靠FLOPs计算量,还应该多方面的考虑,例如MAC(memory acc…

【ArcGIS遇上Python】批量提取多波段影像至单个波段

本案例基于ArcGIS python,将landsat影像的7个波段影像数据,批量提取至单个波段。 相关阅读:【ArcGIS微课1000例】0141:提取多波段影像中的单个波段 文章目录 一、数据准备二、效果比对二、python批处理1. 编写python代码2. 运行代码一、数据准备 实验数据及完整的python位…

HTB:Administrator[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机…

vscode+WSL2(ubuntu22.04)+pytorch+conda+cuda+cudnn安装系列

最近在家过年闲的没事,于是研究起深度学习开发工具链的配置和安装,之前欲与天公试比高,尝试在win上用vscodecuda11.6vs2019的cl编译器搭建cuda c编程环境,最后惨败,沦为笑柄,痛定思痛,这次直接和…

亚博microros小车-原生ubuntu支持系列:17 gmapping

前置依赖 先看下亚博官网的介绍 Gmapping简介 gmapping只适用于单帧二维激光点数小于1440的点,如果单帧激光点数大于1440,那么就会出【[mapping-4] process has died】 这样的问题。 Gmapping是基于滤波SLAM框架的常用开源SLAM算法。 Gmapping基于RBp…

FreeRTOS从入门到精通 第十六章(任务通知)

参考教程:【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili 一、任务通知简介 1、概述 (1)任务通知顾名思义是用来通知任务的,任务控制块中的结构体成员变量ulNotifiedValue就是这个通知值。 (2&#…

数据结构选讲 (更新中)

参考 smWCDay7 数据结构选讲2 by yyc 。 可能会补充的: AT_cf17_final_j TreeMST 的 F2 Boruvka算法 目录 AT_cf17_final_j Tree MSTP5280 [ZJOI2019] 线段树 AT_cf17_final_j Tree MST link 题意 给定一棵 n n n 个点的树,点有点权 w i w_i wi​&am…

【01】共识机制

BTF共识 拜占庭将军问题 拜占庭将军问题是一个共识问题 起源 Leslie Lamport在论文《The Byzantine Generals Problem》提出拜占庭将军问题。 核心描述 军中可能有叛徒,却要保证进攻一致,由此引申到计算领域,发展成了一种容错理论。随着…

春晚舞台上的人形机器人:科技与文化的奇妙融合

文章目录 人形机器人Unitree H1的“硬核”实力传统文化与现代科技的创新融合网友热议与文化共鸣未来展望:科技与文化的更多可能结语 2025 年央视春晚的舞台,无疑是全球华人目光聚焦的焦点。就在这个盛大的舞台上,一场名为《秧BOT》的创意融合…

.NET Core缓存

目录 缓存的概念 客户端响应缓存 cache-control 服务器端响应缓存 内存缓存(In-memory cache) 用法 GetOrCreateAsync 缓存过期时间策略 缓存的过期时间 解决方法: 两种过期时间策略: 绝对过期时间 滑动过期时间 两…

如何从客观角度批判性阅读分析博客

此文仅以个人博客为例,大量阅读朋友反馈给我的交流让我得知他们所理解我的博客所表达的意思并非我所想表达的,差异或大或小,因人而异。 观点与事实 只有从客观角度反复批判性阅读和分析,才能逐渐清晰观点和事实。 观点不等于事实…

【力扣】49.字母异位词分组

AC截图 题目 思路 由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。 可以遍历strs,将其中每一个str排序,然后用unodered_ma…

【4Day创客实践入门教程】Day4 迈向高手之路——进一步学习!

Day4 迈向高手之路——进一步学习! 目录 Day4 迈向高手之路——进一步学习!更多的开发板外壳制作 Day0 创想启程——课程与项目预览Day1 工具箱构建——开发环境的构建Day2 探秘微控制器——单片机与MicroPython初步Day3 实战演练——桌面迷你番茄钟Day4…

什么是线性化PDF?

线性化PDF是一种特殊的PDF文件组织方式。 总体而言,PDF是一种极为优雅且设计精良的格式。PDF由大量PDF对象构成,这些对象用于创建页面。相关信息存储在一棵二叉树中,该二叉树同时记录文件中每个对象的位置。因此,打开文件时只需加…