博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
让你彻底理解 “==”与 Equals
阅读量:5082 次
发布时间:2019-06-13

本文共 3531 字,大约阅读时间需要 11 分钟。

  相信很多朋友在面对,对象判等时经常会犹豫是用“==”还是Equals呢?有时候发现两者得到的结果相同,但有时候有不同,

究竟在什么情况下"==" 会相等,什么情况下Equals会不相等,看完本篇相信你心里自有结论。

 

一 基本概念

  值相等:表示比较的两个对象的数据成员按内存位分别相等,即两个对象类型相同,并且具有相等和相同的字段

     引用相等:表示两个引用指向相同对象实例,也就是同一内存地址,(由引用相等,可以推出其值相等,反之则不能)

 

二 不同类型"=="与Equals 判等结果

     2.1 值类型

           "=="运算符:表示值是否相等

           "Equals":还是表示值是否相等 ,反编译后可以看到Equals 方法还是用了"=="运算符判等

public bool Equals(int obj){    return (this == obj);}

         所以对于值类型 不管是用 "=="运算符还是Equals方法得到的结果都是一样的(方法或运算符没有被重载)

   2.2 引用类型

         2.2.1 一般引用类型的   "=="运算符:表示引用地址是否相等

两个对象虽然值相等,但是属于不同实例,所有引用地址也不一样

object a = new string(new char['a']);            object b = new string(new char['a']);            Console.WriteLine(a == b);//false

    2.2.2一般引用类型的 Equals方法表示值是否相等

object a = new string(new char['a']);            object b = new string(new char['a']);            Console.WriteLine(a.Equals(b));//true

 

   

  2.2.3 特殊引用类型string: “==”运算符:表示值是否相等

 

string a = "123";            string b = "123";            Console.WriteLine(a==b);//true

 

    对于为什么string 会比较值相等,相信大家都有疑问那请看下边的代码

 

注意:两个stirng对象在用"=="运算符判等时会调用 op_Equality()方法,这个方法里究竟做了什么操作呢,反编译一下string类 得到如下代码

我发现op_Equality()方法里居然重写了"=="运算符 且在其中调用了Equals方法,那string类的Equals方法又进行了哪些操作呢,请看图2 

 

跟进Equals方法后发现居然是用"=="操作符判等了,瞬间我明白了大至如下:

因为string类以“==”操作符来处理值相等,

而重写“==”操作符的方法中又调用了Equals方法,

而Equals方法最终还是用"=="操作符判等,

我去~~带我们绕了个圈,最终发现string 类的 Equals方法与"=="操作符,得到结果是一样的

//特殊引用类型string             string a = "123";            string b = "123";            Console.WriteLine(a==b);//true            Console.WriteLine(a.Equals(b));//true

 

三 自定义引用类型 “==”与 Equal判等

    3.1  "=="操作符:表示引用是否相等

  因为两个实例处于托管堆中不同的块中所引用地址必然不同,返回false

class MyClass    {        public string str = "123";    }            MyClass myClass = new MyClass();            MyClass newClass = new MyClass();            Console.WriteLine(myClass == newClass);//false

    3.2 Equals() 方法:表示相个实例是否相等

    注意:为什么会是false 明明两个对象是一样的啊???为什么??为什么???  想知道原因?请接着看

class MyClass    {        public string str = "123";    }     MyClass myClass = new MyClass();     MyClass newClass = new MyClass();     Console.WriteLine(myClass.Equals(newClass));//false

 解释:所有类默认都继承了object类,Object类本身是带有几个方法 的,Equals就是其中之一,因为MyClass没有重载基类Object中的 Equals虚方法所以调用的是Object中的Equals方法 ,那Object中的Equals方法究竟又有什么操作呢?

反编译一下就知道鸟

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries"), __DynamicallyInvokable]public virtual bool Equals(object obj){    return RuntimeHelpers.Equals(this, obj);}
RuntimeHelpers.Equals()方法官方说明:此方法判断指定的 Object 实例是否被视为相等

   很明显 代码中 myClass 与 newClass 属于不同实例,所以会返回false

 

    若要返回True则需要重载Object中的Equals方法如下

 

class OverrideClass    {        public string Str = "123";        //重载Object中Equals方法         public override bool Equals(object obj)        {            OverrideClass nclass = obj as OverrideClass;            //as 如果转换失败会返回null            if (nclass == null)            {                return false;            }            //对比对象属性是否相等            if (this.Str == nclass.Str)            {                return true;            }            else            {                return false;            }        }    }            OverrideClass oClass = new OverrideClass();            OverrideClass nClass = new OverrideClass();             Console.WriteLine(oClass.Equals(nClass));//true

四 总结

到这里“==”与Equals就写完了总结如下:

  值类型:“==”操作符与Equals方法本质上没有区别都将得到相同结果

      引用类型:"=="操作符表示引用地址是否相等,Equals方法表示 是否相等

  自定义引用类型:"=="操作符表示引用地址是否相等,Equals方法 根据重载的情况得到不同结果

      特殊引用类型string:"=="与Equals 存在相互调用,得到结果都一样

 

 

以上纯属个人见解,如有误请一定指出,以免误导

希望本文能带给需要的朋友一点小小的收获,如果您觉得本文对您有那么一点点帮助还望小小的推荐一下啊,您的推荐将是我源源不断的写作力~

 

 

转载于:https://www.cnblogs.com/zery/p/3301288.html

你可能感兴趣的文章
jenkins常用插件汇总
查看>>
c# 泛型+反射
查看>>
第九章 前后查找
查看>>
Python学习资料
查看>>
jQuery 自定义函数
查看>>
jquery datagrid 后台获取datatable处理成正确的json字符串
查看>>
ActiveMQ与spring整合
查看>>
web服务器
查看>>
网卡流量检测.py
查看>>
poj1981 Circle and Points 单位圆覆盖问题
查看>>
POP的Stroke动画
查看>>
SQL语句在查询分析器中可以执行,代码中不能执行
查看>>
yii 1.x 添加 rules 验证url数组
查看>>
html+css 布局篇
查看>>
SQL优化
查看>>
用C语言操纵Mysql
查看>>
轻松学MVC4.0–6 MVC的执行流程
查看>>
redis集群如何清理前缀相同的key
查看>>
Python 集合(Set)、字典(Dictionary)
查看>>
获取元素
查看>>