【C#】【Equals和ReferenceEquals】关于对象和值的问题
在学习C#中的记录类型时,对出现的Equals和ReferenceEquals得到的不同结果表示不理解,随即进行相关资料查找。
值类型
== : 比较两者的“内容”是否相同,即“值”是否一样
Equals:比较两者的“内容”是否相同,即“值”是否一样
ReferenceEquals:返回false,因为会对值类型进行装箱再进行比较
引用类型
== : 比较的是引用变量指向的对象在堆中的存储地址是否一样
Equals: 比较的是引用变量指向的对象在堆中的存储地址是否一样
ReferenceEquals: 比较的是引用变量指向的对象在堆中的存储地址是否一样
看完上述解释后,在分析之前我们先弄明白两个东西,地址概念和装箱操作,地址相关概念这里就不过多赘述了,简单的说一下装箱操作:
1 int num = 10;
2 object obj = num; // 装箱操作
3
4 int num2 = (int)obj; // 拆箱操作
5
6 Console.WriteLine(num2); // 输出结果为 "10"
上述代码中的过程是
1、对num进行复制,假定num所指向的内存空间地址是 0x1 ;
2、对num进行装箱操作,此时将创建一个引用类型对象,假定内存空间为0x2;
3、对象创建完成后,将值类型(num)的值(10)拷贝到对象当中;
4、此时obj将指向这个对象的内存空间地址(0x2);
下面上正餐
1 int a = 1;
2 int b = 1;
3 Console.WriteLine(ReferenceEquals(a, b)); // output:False
4 Console.WriteLine(Equals(a, b)); // output:True
ReferenceEquals会对《值类型》进行装箱操作,从而导致地址发生变化最后返回False,而Equals在进行《值类型》比较时,只看数值是否一致
注意:string类型(字符串)无论是使用ReferenceEquals还是Equals都只比较数值(大坑)!!!
1 string a = "1";
2 string b = "1";
3 Console.WriteLine(ReferenceEquals(a, b)); // output:True
4 Console.WriteLine(Equals(a, b)); // output:True
参考地址:
ReferenceEquals和 == 和equals()的比较 - 王若伊_恩赐解脱 - 博客园 (cnblogs.com)
C# ==、Equals和ReferenceEquals - 温故纳新 - 博客园 (cnblogs.com)
【C#】【Equals和ReferenceEquals】关于对象和值的问题的更多相关文章
- 如何使用==操作符,Equals方法,ReferenceEquals方法,IEquatable接口比较2个对象
"世界上不会有两片完全相同的树叶",这句话适用于现实世界.而在软件世界中,这句话变成了"世界上必须有两片完全相同的树叶",否则,很多事情无以为继. 当比较2个对 ...
- Equals和ReferenceEquals
稍微分析下一下两个方法的区别: public static bool Equals(object objA, object objB); public static bool ReferenceEqu ...
- C#中==、Equals、ReferenceEquals的区别
原文链接:http://www.studyofnet.com/news/1188.html 本文导读: C#中Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不 ...
- ==、Equals 、ReferenceEquals它们的异同
链接 string foobar = "foobar"; string foobar2 = new StringBuilder().Append("foo"). ...
- Struts2 用 s:if test 判断String类型的对象属性值和单字符是否相等的问题
Struts2 用 s:if test 判断String类型的对象属性值和单字符是否相等的问题 首先,这里所指的单字符形如:Y,男. 有两种做法: a. <s:if test='news.s ...
- js关于对象键值为数字型时输出的对象自动排序问题的解决方法
一.对象键值为数字型时输出的对象自动排序问题如: var objs = { "1603":{id:"1603"}, "1702" ...
- 更新AD对象属性值
1. 对于Set-ADUser不包含的对象属性,可以采用replace来操作 Set-ADUser -Identity 'UserA' -Replace @{userWorkstations = 'C ...
- struts2 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用
Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDis ...
- 【freemaker】之自定义变量,特殊变量 globals ,循环对象取值
entity public class Employee { private Integer id; private String name; private Integer age; private ...
- 【freemaker】之循环,判断,对象取值
entity: public class Employee { private Integer id; private String name; private Integer age; privat ...
随机推荐
- LeetCode155:最小栈,最简单的中等难度题,时间击败100%,内存也低于官方
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 最近运气不错,在LeetCode上白捡一道送 ...
- 怎么搭建web组态
web组态是指通过可视化拖拽组件的方式,低代码搭建监控大屏.web页面.物联网各行业的数据以及监控场景,每个行业的业务不同,需要展示的页面也不同.组态快速搭建页面的优势,能更好的满足不同定制化监控页面 ...
- DHorse v1.4.0 发布,基于 k8s 的发布平台
版本说明 新增特性 提供Fabric8客户端操作k8s(预览)的功能,可以通过指定-Dkubernetes-client=fabric8参数开启: Vue.React应用增加Pnpm.Yarn的构建方 ...
- Java笔记(细碎小知识点)1
1.Dos命令:dir:打出当前目录结构:md:创建文件夹:cd+文件夹地址:跳转到当前目录下的对应文件夹:cd..:跳转到上一目录:rd+文件夹:删除文件夹中东西:del+文件(或 "*. ...
- 低代码引擎 TinyEngine 正式发布!
在当今数字化飞速发展的时代,企业对高效.敏捷的应用程序需求日益旺盛.为了满足这一需求,越来越多的低代码开发平台开始涌现.这些平台通过提供简单易用的开发工具和优化后的开发流程,帮助开发者快速构建高质量. ...
- win如何根据端口号查找并杀死一个线程
查看端口占用 netstat -ano | findstr "端口号" 杀死一个进程 taskkill /pid 进程号 -f
- 快速启动Stable Diffusion WebUI
快速启动Stable Diffusion WebUI详情 产品文档 输入文档关键字查找 机器学习PAI 产品概述 快速入门 操作指南 准备工作 开通PAI并创建默认工作空间 开通并授权依 ...
- 实现脚本自动部署docker
前言: 使用场景是 我这边的一个单体项目需要多一个多副本的部署方式,一直输入重复命令我实在是嫌烦了,使用写了一个脚本来一键更新部署上去.jar包都是我手动上传的,没有把包传入公网库里. 之所以记录就是 ...
- 算法修养--广度优先搜索BFS
广度优先算法(BFS) 广度优先算法(Breadth-First Search)是在图和树领域的搜索方法,其核心思想是从一个起始点开始,访问其所有的临近节点,然后再按照相同的方式访问这些临近节点的节点 ...
- 14. 从零开始编写一个类nginx工具, HTTP文件服务器的实现过程及参数
wmproxy wmproxy将用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,后续将实现websocket代理, 内外网穿透等, 会将实现过程分享出来, 感 ...