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()区别的更多相关文章

  1. javaScript中两个等于号和三个等于号之间的区别

    一言以蔽之:==先转换类型再比较,===先判断类型,如果不是同一类型直接为false. ===表示恒等于,比较的两边要绝对的相同 alert(0 == ""); // trueal ...

  2. js里面的等于号--

    一个是赋值等于号,二个是对比等于号,那么三个等于号是什么用的呢   有时候会看到在判断两个对象是否相等的时候使用了三个等号(===),它和两个等号(==)有什么区别呢?简单来说就是使用“==”时,如果 ...

  3. 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配置文件 ...

  4. C#中Equals和= =(等于号)的比较)

    C#中Equals和= =(等于号)的比较) 相信很多人都搞不清Equals和 = =的区别,只是零星的懂一点,现在就让我带大家来进行一些剖析 一.           值类型的比较 对于值类型来说  ...

  5. C#中Equals和= =(等于号)的比较(转)

    一.           值类型的比较 对于值类型来说  两者比较的都是”内容”是否相同,即 值 是否一样,很显然此时两者是划等号的. 例: int i = 9; int j = 9; Console ...

  6. C#中Equals和= =(等于号)的比较)(转载)

    C#中Equals和= =(等于号)的比较) 相信很多人都搞不清Equals和 = =的区别,只是零星的懂一点,现在就让我带大家来进行一些剖析 一.           值类型的比较 对于值类型来说  ...

  7. 【转载】ASP.NET 内联代码、内联表达式、数据绑定表达式使用方法罗列(形式就是常说的尖括号 百分号 等于号 井号)

    ASP.NET 内联代码.内联表达式.数据绑定表达式使用方法罗列(形式就是常说的尖括号 百分号 等于号 井号) 今天在做渭南电脑维修网的一个小功能时遇到了一些问题,因此特别列出,以备他日之用. 首先对 ...

  8. linux shell 单引号 双引号 反引号的区别

    一.单引号和双引号 首先, 单引号和双引号,都是为了解决中间有空格的问题. 因为空格在linux中时作为一个很典型的分隔符,比如 string1=this is a string,这样执行就会报错.为 ...

  9. 黑马程序员——JAVA基础之 == 和equals区别

    java中 == 和equals区别: java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...

随机推荐

  1. python中数组切片[:,i] [i:j:k] [:-i] [i,j,:k]

    逗号","分隔各个维度,":"表示各个维度内的切片,只有:表示取这个维度的全部值,举例说明如下 1 1.二维数组 2 3 X[:,0]取所有行的第0个数据,第二 ...

  2. 如何开发一个APP——转自知乎

    作者:简单点链接:https://www.zhihu.com/question/22999185/answer/155469014来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  3. Keepalived+Nginx高可用实例

    Keepalived+Nginx高可用实例 注意事项: 1.VIP不需要在服务器网络配置文件中配置. 2.nginx主不可用时,需要kill掉nginx主的keepalived服务,这样才可以实现VI ...

  4. Windows安装完ADFS后卸载ADFS清除ADFS数据库

    ADFS卸载后不会卸载掉之前ADFS配置后留下来的数据库,所以如果有必要去删掉这个数据库的话需要找到对应的路径去将数据库删除掉. 具体路径为C:/windows/wid/data/adfsartifa ...

  5. 【Java】 5.0 判断与转换

    [概述] 在if/条件语句中,我们已经谈及判断了,这次将详细讲讲一些逻辑判断 基本逻辑 &:且,And,需要二者均为True |:或,Or ,需要二者其一为False即可 ^:异或,XOE,两 ...

  6. Spring(四)Spring JdbcTemplate&声明式事务

    JdbcTemplate基本使用 01-JdbcTemplate基本使用-概述(了解) JdbcTemplate是spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装.spr ...

  7. 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之实例类型-10

    自动化kolla-ansible部署ubuntu20.04+openstack-victoria之实例类型-10 欢迎加QQ群:1026880196 进行交流学习 实例类型 #controller1 ...

  8. Spring Boot demo系列(三):Spring Web+MyBatis Plus

    2021.2.24 更新 1 概述 Spring Web+MyBatis Plus的一个Demo,内容和上一篇类似,因此重点放在MyBatis Plus这里. 2 dao层 MyBatis Plus相 ...

  9. 14. VUE 子组件修改父组件的值

    在 Vue 当中,父组件 -> 子组件 传值,都是通过属性的形式传递的. 子组件 修改 传递数据 直接操作父组件传递过来的值,用是可以用的,但是打开控制台后,会发现 Vue 有个警告:你不要直接 ...

  10. 手把手教你搭建自己的Angular组件库 - DevUI

    摘要:DevUI 是一款面向企业中后台产品的开源前端解决方案,它倡导沉浸.灵活.至简的设计价值观,提倡设计者为真实的需求服务,为多数人的设计,拒绝哗众取宠.取悦眼球的设计.如果你正在开发 ToB 的工 ...