首頁 >後端開發 >C#.Net教程 >System.Object是什麼?如何使用System.Object?

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

零下一度
零下一度原創
2017-06-23 15:26:422639瀏覽
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所識別的目前物件顯然不能為null
2,如果this和obj實參引用同一個對象,就回傳true。在比較包含大量欄位的物件時,這一步驟有助於提升效能
3,如果this和obj實參引用不同類型的對象,就傳回false。一個string物件顯然不等於一個FileStream物件
4,針對類型定義的每個字段,將this物件中的值與obj物件中的值進行比較,任何字段不相等,就傳回false
5,呼叫基底類別的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,就回傳false
2,如果this和obj實參引用不同類型的對象,就傳回false
3,針對型別定義的每個實例字段,都將this物件中的值與obj物件中的值進行比較(而不是同一性檢查)。 ValueType的Equals內部的實作方式如下:
1,如果obj實參為null,就返回false
2,如果this和obj實參引用不同類型的對象,就回傳false
3,針對類型定義的每個實例字段,都將this物件中的值與obj物件中的值進行比較(透過呼叫字段的equals方法),任何字段不相等,就傳回false
4,回傳true。 ValueType的Equals方法不會呼叫Object的Equals方法
在內部,ValueType的Equals方法利用反射完成上述步驟3,由於CLR反射機制慢,定義自己的值類型時應重寫Equals方法來提供自己的實現,從而提高自己類型的實力進行相等性比較的性能,當然,自己的實現不調用base.Equals.
註:
定義自己的類型時,重寫的Equals要符合相等性的4個特徵
1,Equalse必須自反:x.Equals(x)肯定回傳true
2,Equals必須對稱:x.Equals(y)和y.Equals(x)回傳值相同
3,Equals必須可傳遞:x.Equals(y)回傳true,y.Equals(z)傳回true,則x.Equals(z)肯定回傳true
4,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:
在垃圾回收器判斷物件作為垃圾被回收之後,在物件的記憶體實際回收之前,會呼叫這個虛方法。需要在回收前執行清理工作的類型應重寫此方法。

以上是System.Object是什麼?如何使用System.Object?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn