System.Object是什麼?如何使用System.Object?

來源:互聯網
上載者:User
Object中的公用方法解釋:公用方法:Equals:public class Object {public virtual Boolean Equals(Object obj){//如果兩個引用指向同一個對象,他們肯定包含相同的值if (this == obj) return true;return false;}}假設this和obj執行個體引用同一個對象,就返回true。似乎合理是因為Equals知道對象肯定包含和他自身一樣的值。但假如執行個體引用不同對象,Equals就不肯定對象是否包含相同的值,所以就返回false。換言之,對於Object的Equals方法的預設實現,他是實現的實際是同一性,而非相等性。Equals方法的正確實現:1,如果obj實參為null,就返回false,因為調用非靜態Equals方法時,this所標識的當前對象顯然不能為null2,如果this和obj實參引用同一個對象,就返回true。在比較包含大量欄位的對象時,這一步有助於提升效能3,如果this和obj實參引用不同類型的對象,就返回false。一個string對象顯然不等於一個FileStream對象4,針對類型定義的每個欄位,將this對象中的值與obj對象中的值進行比較,任何欄位不相等,就返回false5,調用基類的Equals方法來比較他的定義的任何欄位,如果基類的Equals方法方法返回false,就返回false,否則就返回true註:同一性問題的測試使用Object的靜態方法ReferenceEquals,其原型如下:public static Boolean ReferenceEquals(Object objA, object objB){return (objA==objB);}檢查同一性問題(看兩個引用是否指向同一個對象)務必調用ReferenceEquals,不應該使用C#的==操作符(除非先把兩個運算元都轉型為Object),因為某個運算元的類型可能重載了==符,為其賦值不同於同一性的語義。System。ValueType(所有實值型別 基類)都重寫了Object的Equals方法,並進行了正確的實現來執行值的相等性檢查(而不是同一性檢查),ValueType的Equals內部實現如下:1,如果obj實參為null,就返回false2,如果this和obj實參引用不同類型的對象,就返回false3,針對類型定義的每個執行個體欄位,都將this對象中的值與obj對象中的值進行比較(而不是同一性檢查)。ValueType的Equals內部的實現方式如下:1,如果obj實參為null,就返回false2,如果this和obj實參引用不同類型的對象,就返回false3,針對類型定義的每個執行個體欄位,都將this對象中的值與obj對象中的值進行比較(通過調用欄位的equals方法),任何欄位不相等,就返回false4,返回true。ValueType的Equals方法不調用Object的Equals方法在內部,ValueType的Equals方法利用反射完成上述步驟3,由於CLR反射機制慢,定義自己的實值型別時應重寫Equals方法來提供自己的實現,從而提高自己類型的實力進行相等性比較的效能,當然,自己的實現不調用base.Equals.註:定義自己的類型時,重寫的Equals要符合相等性的4個特徵1,Equalse必須自反:x.Equals(x)肯定返回true2,Equals必須對稱:x.Equals(y)和y.Equals(x)傳回值相同3,Equals必須可傳遞:x.Equals(y)返回true,y.Equals(z)返回true,則x.Equals(z)肯定返回true4,Equals必須一致。比較兩個值不變,Equals傳回值也不變 GetHashCode:當你定義的類重寫了Equals方法,還必須重寫GetHashCode方法。之所以這樣要求,是由於System.Collections.Hashtable類型,System.Collection.Generic.Dictionary類型以及其他一些集合的實現中,要求兩個對象必須具有相同的雜湊碼才視為相等。所以重寫Equals就必須重寫GetHashCode確保相等性演算法和對象雜湊碼演算法一致性。簡單點說就是,向集合中添加鍵/值對,首先要擷取對象的雜湊碼。該雜湊碼指出鍵/值對要儲存到那個雜湊桶中。集合需要尋找鍵時,會擷取指定鍵對象的雜湊碼,該雜湊碼標識了現在要以順序方式搜尋的雜湊桶,將在其中尋找與指定鍵對象相等的鍵對象。採用這個演算法來儲存和尋找鍵,意味著一旦修改了集合總的一個鍵對象,集合就再也找不到該對象。所以,需要修改雜湊表中的鍵對象時,正確的做法是移除原來的鍵/值對,修改鍵對象,再將新的鍵/值對添加回雜湊表。自訂GetHashCode方法或許不是一件難事,但是取決已資料類型和資料的分布情況。下面會給出一個例子和規則:internal sealed class Point{private readonly Int32 m_x, m_y;public override int GetHashCode(){return m_x ^ m_y; //返回m_x和m_y的XOR結果}}規則:1,這個演算法要提供良好的隨機分布,使雜湊表獲得最佳效能2,可在演算法中調用積累的GetHashCode方法,並包含他的傳回值。但一般不要調用Object或ValueType的GetHashCode方法,因為兩者的實現都與高效能雜湊演算法不沾邊3,演算法執行速度盡量快4,包含相同值的不同對象應返回相同雜湊值。例如,包含相同文本的兩個string對象返回相同的雜湊碼5, System.Object實現的GetHashCode方法對衍生類別型和其他的欄位一無所知,所以返回一個在物件存留期保證不變的編號。ToString:預設傳回型別的完整名稱(this.GetType().FullName)GetType:返回從Type派生的一個類型的執行個體,指出調用GetType的那個對象時什麼類型。返回的Type對象可以和反射類配合,擷取與對象的類型有關的中繼資料資訊。另外GetType是非虛方法,目的是防止類重寫該fangfa,隱瞞企類型,進而破壞型別安全。 受保護方法:MemberwiseClone:這個非虛方法建立類的新執行個體,並阿靜對象的執行個體欄位設與this對象的執行個體欄位完全一致。返回對新執行個體的引用。Finalize:在記憶體回收行程判斷對象作為垃圾被回收之後,在對象的記憶體被實際回收之前,會調用這個虛方法。需要在回收前執行清理工作的類型應重寫該方法。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.