C#基础之==(双等于号)与equals()区别
C#中Equals和= =比较
这两种方式也是大家在日常编码工作当中用的比较多的判断方式、之前在使用的时候也没太关注两者在比较不同类型的时候存在哪些区别、
今天就和大家一起深入了解一下其中区别
一、值类型比较判断
对于值类型来说 两者之间比较的都是”内容”是否相同,即值类型中的数值是否一样,很显然此时两者是划等号的,代码展示如下:
#region 值类型判断
int i = 10;
int j = 10;
Console.WriteLine($"双等于号判断结果为:{(i == j)}");
Console.WriteLine($"Equals判断结果为:{i.Equals(j)}"); #endregion
控制台输出:

由此判断在值类型中使用int类型为例,其中等于号与Equals二者的判断不存在区别、都是比较其中的数值内容、那么引用类型存在区别吗一起来看一看?
一、引用类型比较判断
对于引用类型来说,等号(==)比较的是两个变量的”引用” 是否一样,即是引用的”地址”是否相同。而对于equals来说仍然比较的是变量的 ”内容” 是否一样
1、引用类型中字符串比较(String)
#region 引用类型中String比较
Console.WriteLine("----------------我是分割线-----------------------");
string str1 = "abd";
string str2 = "abd";
Console.WriteLine($"双等于号判断结果为:{(str1 == str2)}");
Console.WriteLine($"Equals判断结果为:{str1.Equals(str2)}");
#endregion
控制台输出:

那么问题来了?Equals是比较其中的数值相等返回True我可以理解、那么字符串中双等于号是比较二者之间的引用、很显然str1变量与str2变量是不同的引用
为什么返回的结果怎么还是True呢?实际的原因是什么呢?一起来看一看
//
// 摘要:
// Determines whether two specified strings have the same value.
//
// 参数:
// a:
// The first string to compare, or null.
//
// b:
// The second string to compare, or null.
//
// 返回结果:
// true if the value of a is the same as the value of b; otherwise, false.
public static bool operator ==(String? a, String? b); //
// 摘要:
// Determines whether this instance and another specified System.String object have
// the same value.
//
// 参数:
// value:
// The string to compare to this instance.
//
// 返回结果:
// true if the value of the value parameter is the same as the value of this instance;
// otherwise, false. If value is null, the method returns false.
public bool Equals(String? value);
不管是==、还是Equals也好都是微软提供的public sealed class String密封类下面的提供的方法、看到此时还看不出其中的缘由、那么直接上反编译工具看一看究竟。

点击str3==str2中的等于号继续查看、发现反编译中查看这个方法的源码返回了Equals这个方法、这样一看就大致清楚了、string类型中微软的开发
人员对这个==进行的重写。


以上是Equals与==反编译源码所以这也就是当我们在比较String类型时、不同的引用、数值一样、Equals与==返回的结果一致、相同、所以在进行String类型判断
这两个方法内部本质是相同的、当然String类型是一个特例。
2、引用类型中自定义类型比较
#region 引用类型中自定义类型t比较
Console.WriteLine("----------------我是分割线-----------------------");
Car car1 = new Car()
{
Age = 4,
Color = "Green"
};
Car car2 = new Car()
{
Age = 4,
Color = "Green"
}; Console.WriteLine($"双等于号判断结果为:{(car1 == car2)}");
Console.WriteLine($"Equals判断结果为:{car1.Equals(car2)}");
控制台输出:

二者都是输出False、由于不同的引用实例、所以引用的地址也是不同的、即使数值相同==也会返回False、可能有人会产生疑问,car1 和car2的内容是相同的啊,为什么他俩的比较结果却是为false呢?。原因就在于在Equals是Object中的一个虚方法,而Car类中没有对它进行重写,因此此时调用的仍是父类中的Equals方法。但是父类是无法知道你都有哪些成员字段的,因此返回的是false。要想让他能够比较两个变量的内容是否相同,那就应该重写Equals方法

2、重写Equals并测试
新建类并测试代码如下:
public class TwoDPoint : System.Object
{
public readonly int x, y; public TwoDPoint(int x, int y)
{
this.x = x;
this.y = y;
} public override bool Equals(System.Object obj)
{
if (obj == null)
{
return false;
} TwoDPoint p = obj as TwoDPoint;
if ((System.Object)p == null)
{
return false;
}
return (x == p.x) && (y == p.y);
} public bool Equals(TwoDPoint p)
{
if ((object)p == null)
{
return false;
} return (x == p.x) && (y == p.y);
} public override int GetHashCode()
{
return x ^ y;
} }
上端调用测试
#region 引用类型中自定义类型t比较
Console.WriteLine("----------------我是分割线-----------------------"); TwoDPoint twoDPoint1 = new TwoDPoint(4, 8);
TwoDPoint twoDPoint2 = new TwoDPoint(4, 8); Console.WriteLine($"双等于号判断结果为:{(twoDPoint1 == twoDPoint2)}");
Console.WriteLine($"Equals重写后判断结果为:{twoDPoint1.Equals(twoDPoint2)}");
#endregion
控制台输出:

结果显示Equals重写后返回True、==引用的地址不同、所以还是返回False、由此可以证明重写后验证成功。
总结:Equals比较的永远是变量的内容是否相同,而= =比较的则是引用地址是否相同(前提:此种类型内部没有对Equals 或= = 进行重写操作,否则输出可能会有不同)
string 类型是个特例,因为他的内部对这两个都进行了重写、以上本人亲测有效、有什么需要改善的欢迎大家提出来、我加以改正。有时候短短几行代码其实要细细研究还是会细思极恐
总而言之还是微软的大佬的给我们封装好了、我们拿来用就可以、但是在用的同时确实也需要有时间研究一下其中原理、其实可以多使用反编译工具研究一下其中代码原理、我这里使用的是
ILSPY
C#基础之==(双等于号)与equals()区别的更多相关文章
- javaScript中两个等于号和三个等于号之间的区别
一言以蔽之:==先转换类型再比较,===先判断类型,如果不是同一类型直接为false. ===表示恒等于,比较的两边要绝对的相同 alert(0 == ""); // trueal ...
- js里面的等于号--
一个是赋值等于号,二个是对比等于号,那么三个等于号是什么用的呢 有时候会看到在判断两个对象是否相等的时候使用了三个等号(===),它和两个等号(==)有什么区别呢?简单来说就是使用“==”时,如果 ...
- centos shell基础 alias 变量单引号 双引号 history 错误重定向 2>&1 jobs 环境变量 .bash_history source配置文件 nohup & 后台运行 cut,sort,wc ,uniq ,tee ,tr ,split, paste cat> 2.txt <<EOF 通配符 glob模式 发邮件命令mail 2015-4-8 第十二节课
centos shell基础知识 alias 变量单引号 双引号 history 错误重定向 2>&1 jobs 环境变量 .bash_history source配置文件 ...
- C#中Equals和= =(等于号)的比较)
C#中Equals和= =(等于号)的比较) 相信很多人都搞不清Equals和 = =的区别,只是零星的懂一点,现在就让我带大家来进行一些剖析 一. 值类型的比较 对于值类型来说 ...
- C#中Equals和= =(等于号)的比较(转)
一. 值类型的比较 对于值类型来说 两者比较的都是”内容”是否相同,即 值 是否一样,很显然此时两者是划等号的. 例: int i = 9; int j = 9; Console ...
- C#中Equals和= =(等于号)的比较)(转载)
C#中Equals和= =(等于号)的比较) 相信很多人都搞不清Equals和 = =的区别,只是零星的懂一点,现在就让我带大家来进行一些剖析 一. 值类型的比较 对于值类型来说 ...
- 【转载】ASP.NET 内联代码、内联表达式、数据绑定表达式使用方法罗列(形式就是常说的尖括号 百分号 等于号 井号)
ASP.NET 内联代码.内联表达式.数据绑定表达式使用方法罗列(形式就是常说的尖括号 百分号 等于号 井号) 今天在做渭南电脑维修网的一个小功能时遇到了一些问题,因此特别列出,以备他日之用. 首先对 ...
- linux shell 单引号 双引号 反引号的区别
一.单引号和双引号 首先, 单引号和双引号,都是为了解决中间有空格的问题. 因为空格在linux中时作为一个很典型的分隔符,比如 string1=this is a string,这样执行就会报错.为 ...
- 黑马程序员——JAVA基础之 == 和equals区别
java中 == 和equals区别: java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...
随机推荐
- 实验四 Python综合实践
课程:<Python程序设计> 班级:1843 姓名:章森洋 学号:20184307 实验教师:王志强 实验日期:2020年5月16日 必修/选修: 公选课 1.实验内容 此处填写实验的具 ...
- SQL注入靶场实战-小白入门
目录 SQL注入 数字型 1.测试有无测试点 2.order by 语句判断字段长,查出字段为3 3.猜出字段位(必须与内部字段数一致)(用union联合查询查看回显点为2,3) 4.猜数据库名,用户 ...
- Docker安装完成后启动报错:Failed to start Docker Application Container Engine
报错如下:显示没有启动 先关闭防火墙:防火墙关闭指令请看 <a href="Linux防火墙篇">https://www.cnblogs.com/szx666/p/1 ...
- css盒模型以及如何计算盒子的宽度
css盒模型以及如何计算盒子的宽度 盒模型 每个存在于可访问性树中的元素都会被浏览器绘制成一个盒子[1]. 每个盒子都可以看成由4部分组成,它们分别是 - 元素外边距(margin).元素边框(bor ...
- 安装mongoDB出现的问题:无法启动
在我的电脑- 管理 - 服务-中会出现一个MongoDB Server的服务,你需要去手动删除这个服务删除指令: 在cmd管理员模式下使用: sc delete MongoDB Server 然后再配 ...
- 201871030140-朱婷婷 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 2018级卓越班 这个作业要求链接 实验三 结对项目 我的课程学习目标 1.体验软件项目开发中的两人合作,练习结对编程:2.掌握GitHub协作开发程序的操作方法. 这个 ...
- Github Pages(io) + 域名重定向 (手把手教你搭建个人网站)
好歹也成为了在读phd的人,拥有个人网站是个有排面有很必要的事儿~ 在这里利用Github Pages + 域名重定向,实现个人网站的光速搭建~ 1.0 Github Repositories 首先你 ...
- IDEA创建XML文件没有Spring Config选项
我在resources目录下导入3个配置文件时,applicationContext-common.xml文件中有4处http地址红色报错,下图为修正后的图片 了解到可能是由于父工程的pom文件中没有 ...
- 2021 DevOpsDays 东京站完美收官 | CODING 专家受邀分享最新技术资讯
DevOpsDays 是一个全球知名的系列技术会议品牌,内容涵盖了软件开发.自动化.测试.安全.组织文化以及 IT 运营的社区会议等.DevOpsDays 由 DevOps 之父 Patrick De ...
- 12- winmerge讲解
WinMerge是一款运行于Windows系统下的免费开源的文件比较/合并的工具,使用它可以非常方便的比较多个文档内容设置是文件夹与文件夹之间的差异.适合程序员或者经常撰写文稿的朋友使用.