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