A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在.NET中,ReferenceEquals()方法是专门用来表示引用相等的;

==运算符和Equals()方法都可以用来表示引用相等和值相等。对于值类型而言, ==和Equals()方法是一样的,使用上没有什么区别。那么重点是引用类型:

从效果上说,对于引用类型, ==运算符表示引用相等(string有运算符重载,除外),而Equals()表示值相等。从效果上讲,这个说法好像不算错,网上也有这么一种说法。



从原理上说,无论是对值类型还是对于引用类型,==运算符和Equals()方法是相同的,当然排除了一个是运算符一个是方法的这个区别。为什么这样说呢?对于值类型而言,==运算符表示值相等,而Equals()方法在绝大多数的值类型中都重写了这个方法,使之能够支持值类型。在值类型这个层面的区别基本可以忽略。而对于引用类型而言, ==运算符表示引用相等(string除外),Equals()默认只支持引用类型(见第二个代码块),也表示引用相等。因此有==运算符既支持引用相等,也支持值相等,同样Equals()方法也支持值相等和引用相等, 所以==运算符和Equals()方法是相同的。那么为什么第三个代码块中的==运算符和Equals()方法的结果屡有不同呢?答案是多肽:子类实例指向父类引用,同种语义不同行为。虽然object为引用类型,而引用类型的Equals()方法的结果应该是引用相等,但由于多肽的存在,object类型的变量中实际存放的是值类型,所以调用的Equals()方法是子类实例的,因此才体现不相等的结果。也正因为如此,值相等还是引用相等和多肽这两个不相干的问题,硬是被说成了==运算符是引用相等而Equals()方法是值相等。



个人认为:==运算符和Equals()方法除了运算符和方法的区别外,再没有别的区别。而所谓的Equals()方法表示值相等的说法只是由于多肽而造成的假象。当然,Equals()用于值相等的说法效果上好像也说得过去。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

1 个回复

正序浏览
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马