System.Objec的使用方法是什么
這篇文章將為大家詳細講解有關System.Objec的使用方法是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
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.Objec的使用方法是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。