C#中Equals和==的区别 (面试官经常会问到)
首先對于值類型來說,并沒有什么區(qū)別。區(qū)別只針對于引用類型。
一、值類型
? ?1.對于值類型來說,兩者比較的都是“內(nèi)容”是否相同,也就是值是否相同(值類型只有存在棧上)。
?
二、引用類型
? ? 1.對于引用類型來說,本身的值存在堆中,在棧中存入本身值的引用,可以根據(jù)引用找到自己。
? ? 所以:
? ? ? ?對于引用類型來說,==比較的兩個(gè)變量的”引用“是否一樣,也就是“地址”是否一樣。而equals比較的是”內(nèi)容“是否一樣。
? ? ? 1.?比較引用類型:
? ? ? ? ? ?
Person p1 = new Person("aa", 12);Person p2 = new Person("aa", 12);Console.WriteLine("Equals和= =(等于號)的比較");Console.WriteLine("p1==p2 " + (p1 == p2));//結(jié)果:false Console.WriteLine("p1.Equals(p2) " + p1.Equals(p2));//結(jié)果:false?
? ? ? ? ? ?p1==p2?的結(jié)果是false,很簡單,因?yàn)樗麄儽旧硎莾蓚€(gè)不同的變量,引用地址是不同的。
? ? ? ? ? ?那么p1.Equals(p2)?為什么是false 呢?
? ? ? ? ? ? ? 因?yàn)镋qulas是object的一個(gè)虛方法,而person并沒有對其進(jìn)行重寫,此時(shí)調(diào)用的是父類的Equlas方法,但是父類是不知道p1和p2中有哪些成員的,
? ? ? ? ? 所以返回false。
? ? ? ? ? 如果想讓其相等,就要重寫父類的Equlas方法,比如:
? ? ? ? ?
public override bool Equals(object obj){Person p = obj as Person;//對變量的所有的屬性都要進(jìn)行比較 只有都相同才返回trueif (this.Age == p.Age && this.Name == p.Name){return true;}else{return false;}}? ? ? ? ? ?
? ? ? ? ?在開發(fā)過程中,會經(jīng)常用到string類型的字段進(jìn)行Equlas比較,但是比較的結(jié)果和==一模一樣。比如:
? ? ? ? ?
string s1 = "abc";string s2 = "abc";Console.WriteLine("s1==s2 " + (s1 == s2));//true Console.WriteLine("s1.Equals(s2) " + s1.Equals(s2));//true? ? ? ?為什么s1和s2兩個(gè)不同的變量Euulas比較的結(jié)果會相同呢?
? 因?yàn)閟tring是微軟封裝的一個(gè)字符串類,在內(nèi)部已經(jīng)對==操作符進(jìn)行了重寫。重寫后比較的是兩個(gè)變量的值是否相同。
? ?內(nèi)部封裝如下:
? ? ? ??
public static bool operator == (string a,string b) {return Equals(a,b); }? ? ??
? ? ?因此,對于string類型來說,比較的都是值是否相等。(可以把string當(dāng)成一個(gè)特殊的引用類型)。
? ? ??
總結(jié):對于值類型來說,Equlas和==并沒有什么區(qū)別,比較的都是值是否相等。
? ? ? ? ? 對于引用類型來說,Equlas比較的是值是否相等,==比較的是引用是否相等。string是個(gè)特殊的引用類型,內(nèi)部進(jìn)行了重寫,==比較的是值是否相等。
? ??
?
轉(zhuǎn)載于:https://www.cnblogs.com/BounceGuo/p/10320873.html
總結(jié)
以上是生活随笔為你收集整理的C#中Equals和==的区别 (面试官经常会问到)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。