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

这篇具有很好参考价值的文章主要介绍了【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)文章来源地址https://www.toymoban.com/news/detail-712189.html

到了这里,关于【C#】【Equals和ReferenceEquals】关于对象和值的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python使用__dict__查看对象内部属性的名称和值

    从以上代码来看;直接使用 mo.__dict__ 即可获取该实例的属性值; 还是上面的类; 我们知道,C、Java等面向对象的编程语言,在进行类的初始化时,对与类的限制是很严格的,这样做的好处是安全,我们试想一下,如果创建的一个类在任何情况下,会被任何外部或者内部方法

    2024年01月18日
    浏览(34)
  • 重写 equals 方法,实现比较两个对象值是否相等

    == 用于比较值的引用地址是否一致,而 equals 用于比较值的内容是否一致,下面我们来比较一下这两个值是否相同 可以发现它的值是相同的 下面我们来对两个对象的值进行比较 可以发现值的内容确实相同,但比较的结果是 false 其实在 object 中的 equals 底层使用的还是 == 进行

    2024年02月07日
    浏览(63)
  • c# ==操作符和equals方法的区别

    在C#中,\\\"==\\\"操作符和Equals()方法有着不同的用途和行为。 \\\"==\\\"操作符: \\\" “操作符用于比较两个对象的值是否相等。当使用” \\\"操作符比较两个引用类型的对象时,它会比较它们的引用是否指向相同的内存地址。 对于值类型(如int、double等),\\\"==\\\"操作符比较它们的实际值。如

    2024年01月23日
    浏览(46)
  • C# Equals()方法报错:NullReferenceException was unhandled

    下面是一个C# Equals() 方法的例子,执行时报错了 报错信息为: NullReferenceException was unhandled Object reference not set to an instance object. Equals报错:NullReferenceException was unhandled 意思是空引用异常未处理;对象引用没有设置为对象实例。 我们该如何分析其原因呢?这就需要理解一下

    2024年02月13日
    浏览(37)
  • Vue 对象删除没有值的项

    在调用后端查询接口时,有的要求参数对象里空值的项不要传,这个时候可以封装一个方法在调用接口前将对象过滤一遍。 1.新建一个名为tools.js的文件,里面放入以下代码  //对象删除没有值的项   export const removePropertyOfNull = (obj) = {     Object.keys(obj).forEach(item={    

    2024年01月24日
    浏览(45)
  • js获取对象属性值的方法

    场景:已知对象的某属性,我们需要获取对象中的属性值 js获取对象属性值的方法 通过 . 获取 通过 [ ] 获取 接下来介绍一下两种方法的不同点 [ ]运算符可以用 数字 作为属性名,点运算符不能 [ ]运算符可以用 变量 作为属性名,点运算符不能 ps: 用变量key获取对象中的属性

    2024年02月02日
    浏览(47)
  • unity关于匀速移动某些值的方法

    可能很多人会用到Verctor3.Lerp、Mathf.LerpUnclamped等等 这种其实不是匀速 看一下这个整体差不多的逻辑 这个逻辑就是,从a值到b值,返回一个a值加(b值-a值)百分比t的值给你。。。写完发现有点白给。 如果不理解我举个例子 我在原点出发,我坐标是a = 0,我要去 b = 10米的地方

    2024年02月15日
    浏览(33)
  • Java对象中转换空值的字段

    在后端返回数据给前端时,公司的框架会把值为null的数据去掉,方便前端取值。 如:Person对象为:{name:\\\"浩二\\\", age:24, weight:null, height:114},那返回给前端的就为{name:\\\"浩二\\\", age:24, height:114}。 如果这个时候有个需求:   Integer类型的字段为null给-1   Long类型的字段为null给-1L   S

    2024年02月08日
    浏览(89)
  • 【若依】关于对象查询list返回,进行业务处理以后的分页问题

    1、查询对象Jglkq返回 list,对 list 进行业务处理后返回,但分页出现问题。  2、最终解决方案,改造 TableDataInfo getDataTable(List listVo,List list)方法 返回list中修改: 

    2024年01月25日
    浏览(43)
  • JSON对象字段为null值的显示处理

    如何将JSON对象中字段为null值的也显示出来 如果字段的值为null,json对象的默认设置是当字段为null时,不会将该字段和null值添加到这个json对象中; 1、针对jackson的json对象全局配置(举例application.properties文件): 针对gson的json对象全局配置(举例application.properties文件): 当然也可以通过

    2024年02月12日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包