Equals与==的区别
Equals与==比较的区别
使用==进行比较,对于值类型和引用类型都是比较两者的在栈中的值是否相同,
使用Equals进行比较时,对于值类型,会首先比较它们的类型是否相同,如果相同,再对他们进行==比较,
而对于引用类型,Equals会比较两个变量是否引用了同一个对象,即对比两个对象在堆中的地址是否相同。
引用类型比较示例如下:
![](https://images2015.cnblogs.com/blog/846715/201605/846715-20160508180313718-1431507188.png)
Object中的Equals方法:
新版本.Netframework中的实现:
![](https://images2015.cnblogs.com/blog/846715/201605/846715-20160508180314296-332943841.png)
旧版本.NetFramework中的实现(3.5)
![](https://images2015.cnblogs.com/blog/846715/201605/846715-20160508180314624-959291849.png)
为什么值类型装箱后使用Equals进行比较时,结果与引用类型比较的结果不同?
当对值类型进行装箱后再进行比较时,==与equals的比较结果:
![](https://images2015.cnblogs.com/blog/846715/201605/846715-20160508180315046-1406349722.png)
当装箱前两个对象类型不相同时,使用Equals进行比较:
![](https://images2015.cnblogs.com/blog/846715/201605/846715-20160508180315405-190737619.png)
原因:
在上述例子中,因为object是所有类型的基类,在Int32中重写了基类中的Equals方法,所以在使用Equals方法进行比较时,实际上调用的是子类中的Equals方法,所以最后获得的结果是如上所示的结果,Int32中Equals方法的源代码如图:
![](https://images2015.cnblogs.com/blog/846715/201605/846715-20160508180315905-1669783892.png)
String类型的比较:
对于string类型,虽然string是引用类型,但是它却拥有值类型的特点,.Net framework对它的实现进行重写,对于string的==比较与Equals比较都会比较字符串实际存储的值是否相同,因为它们最终都是调用了EqualsHelper这个方法。
![](https://images2015.cnblogs.com/blog/846715/201605/846715-20160508180316280-1137587763.png)
String中的==操作符的重载与Equals方法:
![]() |
![]() |
![]() |
作者: 陌上荼靡