開發工具:VS2019
一、關於這兩個比較,需要從值型別和引用型別兩方面來說
(A)先說值型別
上圖:
因為在對值型別進行比較時候,不管 .Equals() 方法還是 == 方法,都是對值型別變數(圖中的A,B,C)裡的值,也就是棧上面的實際存放的東西進行比較,A的10和B的11,B的11和C的11
下圖是值型別在棧中的分配情況
(此圖片複製其他網頁:https://www.cnblogs.com/dotnet261010/p/12324317.html)
(B)引用型別
上圖:
對於引用型別來說,等號 == 比較的是兩個變數的引用地址是否一樣。
可以發現 an01和an02都是 new 出來的,所以這兩個用==判斷時候,肯定不相等。
而對於equals來說仍然比較的是變數引用地址在堆上的值,也就是真實內容是否一樣。
但 an01 和 an02 的內容是相同的啊,為什麼結果還是false?原因引用型別從Object繼承,Equals()是Object中的一個虛方法,
Animal類中沒有進行重寫,沒有自己的判斷,因此此時呼叫的仍是父類中的Equals方法,父類是不知道子類都有哪些成員欄位的,因此返回的是false。要想讓他能夠比較兩個變數的內容是否相同,那就應該重寫Equals() 方法
重寫如下圖:
修改過後,此時再執行程式得出:
下圖是引用型別在記憶體中分配情況
(此圖片複製其他網頁:https://www.cnblogs.com/dotnet261010/p/12324317.html)