昨天看到《项目中的.NET》里面介绍equals()和运算符==的区别,解释的很易懂。所以写在这,巩固一下,都TM赖我这内存超小的脑子。好了,废话不说了。
大家都知道,值类型式存储在内存中的堆栈(简称栈),而引用类型的变量在栈中仅仅是存储应用类型变量的地址,其本身则存储在堆中。
“==”操作符比较的是两个变量的值是否相等,对于引用类型变量表示的是两个变量在栈中的内容是否相同(即变量的存储的地址)。
equals()表示的是两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
string s1=new string(new char[]{'1','2'});
string s2=new string(new char[]{'1','2'});
s1==s2 //返回true
s1.Equals(s2) //返回true
object o1=s1;
object o2=s2;
o1==o2 //返回false
o1.Equals(o2) //返回true
按照"=="操作符和equals的定义,可能不理解为什么s1,s2的变量地址不相同但是用"=="却返回true,这是因为字符串是一个特殊的引用型类型,在C#语言中,重载了string对象的很多方法(包括equals()方法),使string对象用起来就像是值类型一样。
所以s1==s2返回的是true
以上为书中介绍equals()和运算符==的区别,我只是写出了容易误解的部分。如果有幸被大家看到,再次推荐一下《项目中的.NET》,和我一样的初学者也可以看一下。