c#中Equals()与==的比较

背景

平常写代码时,遇到两个String类型比较,在c#中直接使用==,但是回头想一想同样是面向对象的Java中==比较是对象在内存中的首地址,没理由c#会如此独特,为了了解c#的Equals()==,写下这份笔记以提醒自己。

1.Equals()与==的相同之处

首先这里比较两个字符串,看看他们的结果是什么

string s1 = "Hello";
string s2 = "Hello";
string s3 = "hello";
s1.Equals(s2)// 结果为:true
s1.Equals(s3)//结果为:false
s1 == s2//结果为:true
s1 == s3//结果为:false

从运行的结果可以看到在这里两者的效果是相同的。因此总会有这么一句总结:对于值类型,==和Equals()等价,都是比较存储信息的内容(即比较两个对象的值是否相同)
如果这时我们就说两者是等价的未免也太心急了一点,我们翻开某某资料的时候查阅==和Equals()时会有:==号是比较两个引用类型的变量的引用是否一致。现在先说为什么我们使用的时候没有感觉到其中的区别,原因在于微软大牛们对==这个方法进行了重写。这里贴张网上的图:
c#中Equals()与==的比较_第1张图片

2.Equals()与==的不同

上面提到==是比较两个引用类型的变量的引用是否一致,从两个字符串的比较中我们没有看出来,那么现在我们比较两个对象,这样就可以展示他们之间的不同,以及==的真实面目

string s1 = new string(new char[] { 'a', 'b' });
string s2 = new string(new char[] {'a', 'b' });
object objs1 = (object)s1;
object objs2 = (object)s2;
Console.WriteLine(objs1 == objs2);//False
Console.WriteLine(objs1.Equals(objs2));//True

从运行的结果上可以看出于:除string之外的引用类型,==比较的是是否指向同一个堆中地址,Equals()判断内容是否相同。而Equals有这样的效果是因为在C#语言中,重载了Object对象的很多方法(包括equals()方法),使string对象用起来就像是值类型一样
c#中Equals()与==的比较_第2张图片
在测试的时候我写了如下的代码,思路和上面一样,但是结果却是不一样的。

string s1 = "ab";
string s2 = "ab";
object objs1 = (object)s1;
object objs2 = (object)s2;
Console.WriteLine(objs1 == objs2);//True
Console.WriteLine(objs1.Equals(objs2));//True

怎么?难道是我vs出错了,经过检查发现系统并没有给字符串s2分配内存,只是将"ab"指向了s2。所以s1和s2指向的是同一个字符串(字符串在这种赋值的情况下做了内存的优化)
当然,如果我们比较的是自定义的其他引用类型,那么两者都是比较的引用的地址,而非内容。例如:

Boss boss1 = new Boss("经理");
Boss boss2 = new Boss("经理");
// 两个都是领导,不需要和我这个职工比较
Console.WriteLine(boss1 == boss);//False
Console.WriteLine(boss1.Equals(boss2));//False

看来就==和Equals就有这么多可以学到的东西,自己还是勉励加油呀!

你可能感兴趣的:(c#,c#)