首页 > 编程语言 >【C#】【Equals和ReferenceEquals】关于对象和值的问题

【C#】【Equals和ReferenceEquals】关于对象和值的问题

时间:2023-09-19 21:23:18浏览次数:39  
标签:Console C# Equals 地址 num 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)

标签:Console,C#,Equals,地址,num,ReferenceEquals,装箱
From: https://www.cnblogs.com/vangoghpeng/p/17715840.html

相关文章

  • 【题解】CF1817 合集
    CF1817AAlmostIncreasingSubsequence考虑几乎上升的序列的长度,就是我们的区间长度减去\(a_{i-2}\geqa_{i-1}\geqa_i\)的对数,然后维护即可,当然个人感觉自己的代码有点长,可以考虑看洛谷题解代码code:#include<bits/stdc++.h>usingnamespacestd;constintNN=2e5+......
  • CF840C 题解
    一、题目描述:给你一个长度为$n$的序列$a_1\sima_n$,$0\lea_i\le1\times10^9$。求有多少种$1\simn$的全排列$b$,使得对于$i\in[2,n],a_{b_i}\timesa_{b_{i-1}}$不是完全平方数。本题中完全平方数的定义:若存在某个整数$k$,使得$k^2=x$,则$x$是一个......
  • 本地缓存无冕之王Caffeine Cache
    本文已收录至GitHub,推荐阅读......
  • C:\Keil_v5\ARM\ARMCC\include\stdint.h contains an incorrect path.
    1.问题在使用Keiluvison5打开例程代码进行学习时,发现部分.h文件无法读取2.解决方法1.找到如图的设置按钮(小锤子)2.根据自己所用的是C/C++还是ARM选择(我这里是C/C++)3.在includepath这里加入内容4.找到你自己安装目录下的如图目录5.将其中的include目录绝对路径加入in......
  • 【Azure 存储服务】访问Azure Blob File遇见400-Condition Headers not support错误的
    问题描述在微软云存储账号的服务中,存储一些静态图片,然后通过AppService访问,但是遇见了400-conditionheadersnotsupport错误。在单独通过浏览器访问FileShare中的文件,发现第一次可以请求成功,但是第二次刷新后就遇见400错误,第三次刷新的时候又访问成功,如此循环下去。错误消......
  • zone.js由入门到放弃之五——NgZone & ApplicationRef源码分析
    啸达同学刚写zone.js系列就说过,NgZone影响着Angular中的变更检测,历时一个多月的笔耕不辍,终于到了他初次下笔时的目的地~zone.js系列zone.js由入门到放弃之一——通过一场游戏认识zone.jszone.js由入门到放弃之二——zone.jsAPI大练兵zone.js由入门到放弃之三——zone.js源码分析......
  • git add,conmmit,pull,push的顺序问题
    本地仓库和本地分支有什么区别?答:本地有工作区和版本库,版本库有暂存区,和分支,本地分支属于本地仓库里,是包含关系,一个仓库里可以有很多分支。commit是提交到本地仓库,然后push,这个push是把所有代码推到远程仓库,还是只是把commit的地方推到远程仓库?答:肯定不会全量推送到远程的,是通......
  • 七天学会C语言-第四天(数组)
    1.定义一维数组在C语言中,一维数组是具有相同数据类型的元素的有序集合。定义一维数组的基本语法如下:data_typearray_name[array_size];其中:data_type 是数组元素的数据类型,可以是整数、浮点数、字符等。array_name 是数组的名称,你可以自定义。array_size 是数组的大小,指定了数......
  • Troubleshooting:Helm postgres cannot create director
    helminstallpostgres报错如下:postgresql12:12:18.62postgresql12:12:18.62WelcometotheBitnamipostgresqlcontainerpostgresql12:12:18.62Subscribetoprojectupdatesbywatchinghttps://github.com/bitnami/bitnami-docker-postgresqlpostgres......
  • 小夜灯CB证书CE证书LVD证书EMC证书FCC证书EN60598-2-12
    小夜灯检测报告找我办理。小夜灯GB7000.212报告,小夜灯IEC60598-2-12报告小夜灯EN60598-2-12报告小夜灯CE证书小夜灯FCC证书小夜灯ROHS证书小夜灯REACH证书小夜灯EN62471报告小夜灯SAA证书小夜灯CB证书小夜灯TUV证书小夜灯COC证书小夜灯LVD证书小夜灯EMC证书小夜灯I......