【C#】【Equals和ReferenceEquals】关于对象和值的问题
1.【C#】【串口通信(Serial Port)】【实例】建议串口调试WinForm桌面应用实例——已实现功能<存在未知BUG>2.【C#】【命名空间(namespace)】.NET6.0后支持的顶级语句使用问题
3.【C#】【Equals和ReferenceEquals】关于对象和值的问题
4.【C#】【IO】【实例】统计多个文件夹下的图片5.【C#】【字符串内插】关于$" "(字符串内插构造格式化字符串)的使用6.【C#】【IO】【实例】接上一个统计的新功能7.【C#】【DateTime】获取当前时间的前一天或者后一天方法学习8.【C#】【System.IO】关于拷贝文件夹以及(Directory和DirectoryInfo、File和FileInfo)的区别9.【C#】【System.Linq】一些便捷的数据处理方法(Range、Select)10.【C#】【IO】【Threading】【实例】工作报表前的本地数据聚合操作11.【C#】【WinForm】MDI窗体在学习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#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)