千家信息网

Equals、==和RefrenceEquals的区别是什么

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇文章为大家展示了Equals、==和RefrenceEquals的区别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。我们这里将简单对比Equals、
千家信息网最后更新 2026年11月03日Equals、==和RefrenceEquals的区别是什么

本篇文章为大家展示了Equals、==和RefrenceEquals的区别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

我们这里将简单对比Equals、==和RefrenceEquals的区别,我们将从引用类型的比较以及类型来进行分析。

今天无意看到一篇有关Equals和==的区别的帖子,帖子中间简单的说成是比较引用和比较值,这样的理解很有问题。

看了看MSDN,总结如下。

从两个方面来说说这三者的区别。

先给出一个类和一个结构:

public class RefrenceClass      {          public int X          {get;set;}                    public string Y          {get;set;}      }            public struct ValueStruct      {          public int x;          public string y;      }

1.引用类型的比较

看看以下这段代码会输出何种结果

RefrenceClass c1 = new RefrenceClass();              c1.X = 1;              c1.Y = "OK";              RefrenceClass c2 = new RefrenceClass();              c2.X = 1;              c2.Y = "OK";              RefrenceClass c3 = new RefrenceClass();              c3.X = 1;              c3.Y = "OK!";              RefrenceClass c4 = new RefrenceClass();              c4.X = 2;              c4.Y = "OK";              RefrenceClass c5 = new RefrenceClass();              c5=c1;              c5.X = 2;              RefrenceClass c6 = c1;              Console.WriteLine(ReferenceEquals(c1,c2).ToString());              Console.WriteLine(ReferenceEquals(c1,c3).ToString());              Console.WriteLine(ReferenceEquals(c1,c4).ToString());              Console.WriteLine(ReferenceEquals(c1,c5).ToString());              Console.WriteLine(ReferenceEquals(c1,c6).ToString());              Console.WriteLine();              Console.WriteLine(Equals(c1,c2).ToString());              Console.WriteLine(Equals(c1,c3).ToString());              Console.WriteLine(Equals(c1,c4).ToString());              Console.WriteLine(Equals(c1,c5).ToString());              Console.WriteLine(Equals(c1,c6).ToString());              Console.WriteLine();              Console.WriteLine(c1.Equals(c2).ToString());              Console.WriteLine(c1.Equals(c3).ToString());              Console.WriteLine(c1.Equals(c4).ToString());              Console.WriteLine(c1.Equals(c5).ToString());              Console.WriteLine(c1.Equals(c6).ToString());              Console.WriteLine();              Console.WriteLine(c1==c2);              Console.WriteLine(c1==c3);              Console.WriteLine(c1==c4);              Console.WriteLine(c1==c5);              Console.WriteLine(c1==c6);              Console.WriteLine();c1,c2,c3,c4为不同的实例,c1,c5,c6是同一个引用

返回的结果都是 前三个比较为false,后两个为true

由结果看,静态RefrenceEquals、静态Equals、虚拟Equals和==比较的都是引用地址

而当我们换成比较Struct的时候,静态RefrenceEquals的结果均为false,静态Equals、虚拟Equals的结果为true,false,false,false,true,==不可用在此处由这个结果看静态Equals、虚拟Equals比较的是值

这就和我们上面得出的结果不一样了,那到底比较的是什么呢?

我们按类型来分析:

1.静态RefrenceEquals,从方法名也可以看出比较的是引用地址,在对值类型进行此比较时,始终为false,即使是RefrenceEauals(1,1),因为这里它把值首先装箱再进行比较,所以两个的引用地址是不一样的,但是RefrenceEquals(null,null)的值是true;

2.静态Equals方法,这个方法其实最终是调用了虚拟Equals方法的不同重载

3.虚拟Equals方法,可在不同类中重载,这里我们就可以理解为什么上面的两种不同类型变量的比较会有不同的结果了,比如String.Equals方法就是用于判断两个字符串的内容是否相等

一般来说,对于值类型,类型相同,并且数值相同(对于struct的每个成员都必须相同),则Equals返回true,否则返回false。而对于引用类型,默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时候才返回true。静态Equals相比虚拟Equals方法有一个优点,就在于它不用考虑比较的对象是否为null;

4.==运算符,对于内置的值类型,直接判断两个对象的值是否相等,并会根据需要对对象进行类型转换,对于用户定义的值类型,比如struct,不可使用;杜宇引用类型,默认的行为与ReferenceEquals的行为相同,但是很多类对==进行了重载,比如String。

上述内容就是Equals、==和RefrenceEquals的区别是什么,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

类型 结果 静态 方法 两个 相同 不同 对象 行为 内容 地址 就是 帖子 技能 时候 知识 分析 简明 简明扼要 一般来说 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技工作委员会 金诺互联网科技 腾讯阿里互联网科技 金融科技创新监管互联网金融 上海挚品互联网科技 互联网科技类展会 北京大学互联网科技怎么样 剑昆互联网络科技有限公司临桂 团飞科技与伯堂互联网服务平台 互联网和黑科技的看法 互联网公司科技股 上海宁丞科技互联网 南博望互联网科技有限公司 中和天地互联网科技有限公司 锡山区互联网智能科技产品供应 产业互联网科技服务公司 上海创道互联网络科技有限公司 全球科技与互联网公司市值变化 保山浩联互联网科技有限公司 互联网企业和网络科技有限公司 蓝思科技飞鸽互联网 重庆互联网络科技 万达互联网科技 广州优美互联网科技 上海宁丞科技互联网 健康食品互联网创新科技园项目 如何创新互联网科技 互联网科技创新的路径 互联网时代科技型公司的机会 瑞安市蟠桃会互联网科技有限公司
0