開發工具: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)