在学习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】关于对象和值的问题的更多相关文章

  1. 如何使用==操作符,Equals方法,ReferenceEquals方法,IEquatable接口比较2个对象

    "世界上不会有两片完全相同的树叶",这句话适用于现实世界.而在软件世界中,这句话变成了"世界上必须有两片完全相同的树叶",否则,很多事情无以为继. 当比较2个对 ...

  2. Equals和ReferenceEquals

    稍微分析下一下两个方法的区别: public static bool Equals(object objA, object objB); public static bool ReferenceEqu ...

  3. C#中==、Equals、ReferenceEquals的区别

    原文链接:http://www.studyofnet.com/news/1188.html 本文导读: C#中Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不 ...

  4. ==、Equals 、ReferenceEquals它们的异同

    链接 string foobar = "foobar"; string foobar2 = new StringBuilder().Append("foo"). ...

  5. Struts2 用 s:if test 判断String类型的对象属性值和单字符是否相等的问题

    Struts2 用 s:if test 判断String类型的对象属性值和单字符是否相等的问题   首先,这里所指的单字符形如:Y,男. 有两种做法: a. <s:if test='news.s ...

  6. js关于对象键值为数字型时输出的对象自动排序问题的解决方法

    一.对象键值为数字型时输出的对象自动排序问题如: var objs = {    "1603":{id:"1603"},    "1702" ...

  7. 更新AD对象属性值

    1. 对于Set-ADUser不包含的对象属性,可以采用replace来操作 Set-ADUser -Identity 'UserA' -Replace @{userWorkstations = 'C ...

  8. struts2 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

    Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDis ...

  9. 【freemaker】之自定义变量,特殊变量 globals ,循环对象取值

    entity public class Employee { private Integer id; private String name; private Integer age; private ...

  10. 【freemaker】之循环,判断,对象取值

    entity: public class Employee { private Integer id; private String name; private Integer age; privat ...

随机推荐

  1. .NET周刊【9月第1期 2023-09-03】

    国内文章 如何正确实现一个自定义 Exception https://www.cnblogs.com/kklldog/p/how-to-design-exception.html 最近在公司的项目中, ...

  2. redisson分布式锁的应用——秒杀、超卖 简单例子(分布式锁相关)

    1.常见的分布式事务锁 1.数据库级别的锁 乐观锁,给予加入版本号实现 悲观锁,基于数据库的for update实现 2.Redis,基于SETNX.EXPIRE实现 3.Zookeeper,基于In ...

  3. Skynet通讯遇到的奇怪问题

    问题 最近在做一个内部通讯的服务器, 用的自带的gateserver和socketchannel做通讯, 在使用skynet.unpack或者string.unpack("XXXX" ...

  4. Solution -「HNOI 2010」城市建设

    Description Link. 修改边权的动态 MST. Solution 讲清楚点. 修改边权的 MST,考虑对时间分治.设我们当前操作的操作区间是 \([l,r]\),直接暴力找 MST 是不 ...

  5. Azure Data Factory(九)基础知识回顾

    一,引言 在本文中,我们将继续了解什么是 Azure Data Factory,Azure Data Factory 的工作原理,Azure Data Factory 数据工程中的数据管道,并了解继承 ...

  6. c语言代码练习4(改进)

    #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <wi ...

  7. C++在HotSpot VM中一种巧妙的内存管理方式

    在HotSpot VM中定义了一个Relocation类及相关的子类,可以通过这些类操作不同的重定位数据,如在CodeCache中读写这些数据.这些类需要的内存很小,但是不同的类需要的内存大小又不一样 ...

  8. IDEA工具第一篇:细节使用-习惯设置

    安装好Idea后,直接上手clone代码进入编码时代,有没有那么一刻你会觉用起来没有那么顺手流畅呢? 下面是关于 [Windows] 下安装idea的一些习惯设置[ Mac大致一样 ] 一.修改系统文 ...

  9. [ABC212E] Safety Journey 题解

    Safety Journey 题目大意 给定一张缺少了 \(m\) 条边的 \(n\) 个点的完全图和一个正整数 \(k\),你需要求出满足以下条件的序列 \(A\) 的数量: \(A\) 的长度为 ...

  10. DFS(深度优先搜索)洛谷P1162

    看大佬们dfs一遍就出结果,蒟蒻的我dfs了三遍,当然这题也可以用bfs做,但是dfs不用队列代码短一些. #include <iostream> #include <vector& ...