- 檢查傳入的參數是否為null, 如果為null,那么返回false, 否則執行步驟2
- 調用ReferenceEquals查看是否為統一個對象,如果是,那么返回true, 否則執行步驟3
- 判斷兩者是否為同一類型,如果不是,那么返回false,否則執行步驟4
- 調用自己寫的一個Equals方法重載,其參數為具體子類型而非object,然后返回其執行結果
- 在重載的Equals方法中,調用GetHashCode函數並判斷兩者的返回值是否相同,如果不同則返回false,否則執行步驟6
- 在重載的Equals方法中,判斷類型的父類是否為Object,如果不是則調用Base.Equals,如果Base.Equals返回false, 那么返回false,否則執行步驟7
- 比較類型自己的Field是是否相等,如果相等則返回true,否則返回false。
- 除此之外,還需要重載GetHashCode函數以及==,!=運算符
以上是完整的重載步驟,使用時根據具體情況可以跳過一些,比如對struct類型重載Equals時,步驟2應該省略。在實踐中,經常出問題的情況是把hashcode相等和Equals相等等價了即:hashcode相等 <=> equals 相等,正確的情況是hashcode不相等=>equals不相等,equals相等=>hashcode相等,反之則不正確。