翼度科技»论坛 编程开发 .net 查看内容

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

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
在学习C#中的记录类型时,对出现的Equals和ReferenceEquals得到的不同结果表示不理解,随即进行相关资料查找。
 
值类型
== : 比较两者的“内容”是否相同,即“值”是否一样
Equals:比较两者的“内容”是否相同,即“值”是否一样
ReferenceEquals:返回false,因为会对值类型进行装箱再进行比较
 
引用类型
== : 比较的是引用变量指向的对象在堆中的存储地址是否一样
Equals: 比较的是引用变量指向的对象在堆中的存储地址是否一样
ReferenceEquals: 比较的是引用变量指向的对象在堆中的存储地址是否一样
 
看完上述解释后,在分析之前我们先弄明白两个东西,地址概念和装箱操作,地址相关概念这里就不过多赘述了,简单的说一下装箱操作:
  1. 1 int num = 10;
  2. 2 object obj = num; // 装箱操作
  3. 3
  4. 4 int num2 = (int)obj; // 拆箱操作
  5. 5
  6. 6 Console.WriteLine(num2); // 输出结果为 "10"
复制代码
上述代码中的过程是
1、对num进行复制,假定num所指向的内存空间地址是  0x1 ;
2、对num进行装箱操作,此时将创建一个引用类型对象,假定内存空间为0x2;
3、对象创建完成后,将值类型(num)的值(10)拷贝到对象当中;
4、此时obj将指向这个对象的内存空间地址(0x2);
 
下面上正餐
  1. 1 int a = 1;
  2. 2 int b = 1;
  3. 3 Console.WriteLine(ReferenceEquals(a, b)); // output:False
  4. 4 Console.WriteLine(Equals(a, b)); // output:True
复制代码
ReferenceEquals会对《值类型》进行装箱操作,从而导致地址发生变化最后返回False,而Equals在进行《值类型》比较时,只看数值是否一致
 
注意:string类型(字符串)无论是使用ReferenceEquals还是Equals都只比较数值(大坑)!!!
  1. 1 string a = "1";
  2. 2 string b = "1";
  3. 3 Console.WriteLine(ReferenceEquals(a, b)); // output:True
  4. 4 Console.WriteLine(Equals(a, b)); // output:True
复制代码
 
 
参考地址:
ReferenceEquals和 == 和equals()的比较 - 王若伊_恩赐解脱 - 博客园 (cnblogs.com)
C# ==、Equals和ReferenceEquals - 温故纳新 - 博客园 (cnblogs.com)

来源:https://www.cnblogs.com/vangoghpeng/archive/2023/09/19/17715840.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具