說起.NET中的類,本是同根生,一點不為過。因為CLR要求所有類都要繼承自System.Object。所有對象都必須提供一組通用操作,包括對象的等值性、唯一性、散列碼以及克隆。
一、等值性——Equals()方法
有時候我們需要比較兩個對象是否相等,比如在一個ArrayList中進行排序查找等操作時。
System.Object提供了Equals()虛方法:
class Object
{
public virtual Boolean Equals(object o)
{
if (this == o) return true;
else return false;
}
}
這種判斷方式非常簡單:直接比較是兩個引用是否指向的是同一對象。但這樣比較是不確切的。所以我們需要重寫該方法,提供更合適的實現方式。
重寫時Equals()四大原則:
- 自反。即x.Equals(x)必須為true。
- 對稱。即x.Equals(y)和y.Equals(x)必須返回同樣的值。
- 可傳遞。即如果x.Equals(y)和y.Equals(z)都返回true,則x.Equals(z)也返回true。
- 前后一致。如果兩個對象的值沒變,那么多次比較的值都應該是相同的。
重寫思路
- 1. 如果參數obj為null,返回false。因為在非靜態方法中,使用this表示的當前對象肯定不是Null。
- 2. 如果this和obj參數指向同一實例對象,返回true。 這樣省略字段比對過程,提高性能。
- 3. 如果this 和obj參數指向的對象類型不同,則返回false。
- 4. 比較this和obj中每個實例字段,如果字段不相等則返回false。
- 5. 調用基類的Equals方法,如果調用結果為false,則返回false;
- 6. 至此,才能返回true。