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 ...
随机推荐
- 微信小程序 | flex布局属性
flex-direction 主轴方向 row: 横向 row-reverse: 横向倒序 column: 纵向 column-reverse: 纵向倒序; flex-wrap 元素排列换行 nowr ...
- Java【线程池、Lambda表达式】
见pdf 等待唤醒机制 wait和notify 第二章 线程池 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低 系统的效率,因为频繁创建线程和销毁 ...
- Seata搭建与分布式事务入门
在单体架构下,我们大多使用的是单体数据库,通过数据库的ACID特性支持,实现了本地事务.但是在微服务架构下复杂的业务关系中,分布式事务是不可避免的问题之一.Seata是Spring Cloud Ali ...
- Ambassador-09-prefix正则表达式
设置 prefix_regex: true,即prefix就可以设置成正则表达式 --- apiVersion: getambassador.io/v2 kind: Mapping metadata: ...
- Ambassador-08-跨域
官方文档:https://www.getambassador.io/docs/latest/topics/using/cors/ Cross-Origin Resource Sharing-CORS ...
- 做个开源博客学习Vite2 + Vue3 (四)实现博客功能
我们再来看一下管理类的设计. Composition API,就是组合API的意思,那么是不是应该把js代码分离出来,做成独立的管理类的形式呢? 这样代码可以更整洁一些,主要是setup里面的代码就不 ...
- JDBC_11_PreparedStatement(增删改操作)
PreparedStatement(增删改操作) * 代码: ``` import javax.swing.plaf.nimbus.State; import java.sql.*; public c ...
- ASP微信服务号H5客户登陆,且获取客户授权的用户基本信息
ASP微信服务号H5客户登陆,且获取客户授权的用户基本信息是需要客户授权,下面讲解详细步骤: 第一步:客户点击登录页,自动跳转到微信服务器端获取code 第二步:用第一步获取的code去获取客户的ac ...
- 08- adb常用命令以及模拟器链接adb命令
adb 命令简介 ADB即 Android debug bridge.是Android下面一个通用的调试工具. 熟练使用adb命令会大大增加开发效率,作为测试人员,熟练掌握adb,我们可以管理设备或手 ...
- Android Linux deploy
起因 旧安卓手机(小米5) 改造成服务器 开始 准备工作 小米5手机 下载Busybox busybox提供linux下基本的操作命令,也包含了 Android 系统的自带的shell Linux d ...