在C#中,所有類從object類派生而來。
它可執行的方法:
public virtual bool Equals(object obj):用于一個對象同另一個對象相比較,若兩個對象相等,則傳回值為ture,否則傳回值為false。這種方法被标記為virtual,意味着使用者可在自己的C#類中覆寫該方法。
public virtual int GetHashCode():用于計算對象的散列碼。
public Type GetType():用于傳回一個稱為Type的.NET類的對象,提供目前類的有關資訊。
public virtual string ToString(): 用于傳回一個代表使用者對象的字元串。
protected virtual void Finalize():當CLR的垃圾回收器破壞(釋放)一個對象時,該方法可以(或不可以)被調用。
protected object MemberwiseClone():用于建立對象的一個克隆,形成的克隆同目前對象具有相同的狀态,并且傳回被克隆的對象。
對象的散列碼
在前一篇讀書筆記裡已經提過,如果我們定義的一個類型隻重寫了Equals而沒有重寫GetHashCode方法時編譯器會發出警告資訊。
一個類型為什麼要同時重寫Equals方法和GetHashCode方法?這是因為System.Collections.Hashtable類型的實作要求任何兩個相等的對象都必須有相同的散列碼值。即GetHashCode的行為依賴于Equals方法進行判斷。是以,如果我們重寫了Equals方法,也應該(必須)重寫GetHashCode方法以確定用來判等的算法和用來計算對象散列碼的算法一緻。
基本上來講,當我們向一個Hashtable對象中添加一個“鍵/值對”時,其中“鍵對象”的散列碼會首先被擷取。該散列碼指出了“鍵/值對”應該被存儲在哪個“散列桶”中。當Hashtable對象需要查找某個“鍵”時,它會取得指定的“鍵對象”散列碼。然後在該散列碼所辨別的那個“散列桶”中進一步查找和指定的“鍵對象”相等的“鍵對象”。使用這種存儲和搜尋的“鍵”算法意味着如果我們改變了Hashtable中的一個“鍵對象”,我們在Hashtable中将不能再找到該對象。如果我們改變一個散清單中的“鍵對象”,我們應該首先删除原來的“鍵/值對”,然後改變“鍵對象”,最後再将新的“鍵/值對”添加到散清單中。
System.Object中實作的GetHashCode方法對于它的派生類型及其内的字段一無所知。出于這個原因,Object的GetHashCode方法傳回的是一個在應用程式域範圍内確定唯一的數值。該數值在整個生命周期中保證不會改變。但是,在對象被執行垃圾收集後,這個唯一的數值可以被重新利用作為一個新的對象的散列碼。
System.ValueType中實作的GetHashCode方法使用反射來傳回定義在類型中第一個執行個體字段的散列碼。這個簡單的實作對于某些值類型來說可能已經夠用,但是還是建議最好提供自己的實作。即使我們實作的算法同樣傳回一個執行個體字段的散列碼,我們的實作也要比ValueType中實作的快一些(why?因為是直接調用的緣故?)下面是ValueType中實作的GetHashCode方法:
轉載于:https://www.cnblogs.com/monkey880/archive/2008/07/11/1241132.html