日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

System.Object简介

發(fā)布時間:2024/4/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 System.Object简介 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Object中的公共方法解釋: 公共方法: Equals: public class Object { public virtual Boolean Equals(Object obj) { //如果兩個引用指向同一個對象,他們肯定包含相同的值 if (this == obj) return true; return false; } } 假設(shè)this和obj實例引用同一個對象,就返回true。似乎合理是因為Equals知道對象肯定包含和他自身一樣的值。但假如實例引用不同對象,Equals就不肯定對象是否包含相同的值,所以就返回false。換言之,對于Object的Equals方法的默認(rèn)實現(xiàn),他是實現(xiàn)的實際是同一性,而非相等性。 Equals方法的正確實現(xiàn): 1,如果obj實參為null,就返回false,因為調(diào)用非靜態(tài)的Equals方法時,this所標(biāo)識的當(dāng)前對象顯然不能為null 2,如果this和obj實參引用同一個對象,就返回true。在比較包含大量字段的對象時,這一步有助于提升性能 3,如果this和obj實參引用不同類型的對象,就返回false。一個string對象顯然不等于一個FileStream對象 4,針對類型定義的每個字段,將this對象中的值與obj對象中的值進(jìn)行比較,任何字段不相等,就返回false 5,調(diào)用基類的Equals方法來比較他的定義的任何字段,如果基類的Equals方法方法返回false,就返回false,否則就返回true 注: 同一性問題的測試使用Object的靜態(tài)方法ReferenceEquals,其原型如下: public static Boolean ReferenceEquals(Object objA, object objB) { return (objA==objB); } 檢查同一性問題(看兩個引用是否指向同一個對象)務(wù)必調(diào)用ReferenceEquals,不應(yīng)該使用C#的==操作符(除非先把兩個操作數(shù)都轉(zhuǎn)型為Object),因為某個操作數(shù)的類型可能重載了==符,為其賦值不同于同一性的語義。 System。ValueType(所有值類型 基類)都重寫了Object的Equals方法,并進(jìn)行了正確的實現(xiàn)來執(zhí)行值的相等性檢查(而不是同一性檢查),ValueType的Equals內(nèi)部實現(xiàn)如下: 1,如果obj實參為null,就返回false 2,如果this和obj實參引用不同類型的對象,就返回false 3,針對類型定義的每個實例字段,都將this對象中的值與obj對象中的值進(jìn)行比較(而不是同一性檢查)。ValueType的Equals內(nèi)部的實現(xiàn)方式如下: 1,如果obj實參為null,就返回false 2,如果this和obj實參引用不同類型的對象,就返回false 3,針對類型定義的每個實例字段,都將this對象中的值與obj對象中的值進(jìn)行比較(通過調(diào)用字段的equals方法),任何字段不相等,就返回false 4,返回true。ValueType的Equals方法不調(diào)用Object的Equals方法 在內(nèi)部,ValueType的Equals方法利用反射完成上述步驟3,由于CLR反射機制慢,定義自己的值類型時應(yīng)重寫Equals方法來提供自己的實現(xiàn),從而提高自己類型的實力進(jìn)行相等性比較的性能,當(dāng)然,自己的實現(xiàn)不調(diào)用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: 當(dāng)你定義的類重寫了Equals方法,還必須重寫GetHashCode方法。之所以這樣要求,是由于System.Collections.Hashtable類型,System.Collection.Generic.Dictionary類型以及其他一些集合的實現(xiàn)中,要求兩個對象必須具有相同的哈希碼才視為相等。所以重寫Equals就必須重寫GetHashCode確保相等性算法和對象哈希碼算法一致性。簡單點說就是,向集合中添加鍵/值對,首先要獲取對象的哈希碼。該哈希碼指出鍵/值對要存儲到那個哈希桶中。集合需要查找鍵時,會獲取指定鍵對象的哈希碼,該哈希碼標(biāo)識了現(xiàn)在要以順序方式搜索的哈希桶,將在其中查找與指定鍵對象相等的鍵對象。采用這個算法來存儲和查找鍵,意味著一旦修改了集合總的一個鍵對象,集合就再也找不到該對象。所以,需要修改哈希表中的鍵對象時,正確的做法是移除原來的鍵/值對,修改鍵對象,再將新的鍵/值對添加回哈希表。 自定義GetHashCode方法或許不是一件難事,但是取決已數(shù)據(jù)類型和數(shù)據(jù)的分布情況。下面會給出一個例子和規(guī)則: 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結(jié)果 } } 規(guī)則: 1,這個算法要提供良好的隨機分布,使哈希表獲得最佳性能 2,可在算法中調(diào)用積累的GetHashCode方法,并包含他的返回值。但一般不要調(diào)用Object或ValueType的GetHashCode方法,因為兩者的實現(xiàn)都與高性能哈希算法不沾邊 3,算法執(zhí)行速度盡量快 4,包含相同值的不同對象應(yīng)返回相同哈希值。例如,包含相同文本的兩個string對象返回相同的哈希碼 5, System.Object實現(xiàn)的GetHashCode方法對派生類型和其他的字段一無所知,所以返回一個在對象生存期保證不變的編號。 ToString: 默認(rèn)返回類型的完整名稱(this.GetType().FullName) GetType: 返回從Type派生的一個類型的實例,指出調(diào)用GetType的那個對象時什么類型。返回的Type對象可以和反射類配合,獲取與對象的類型有關(guān)的元數(shù)據(jù)信息。另外GetType是非虛方法,目的是防止類重寫該fangfa,隱瞞企類型,進(jìn)而破壞類型安全。 受保護方法: MemberwiseClone: 這個非虛方法創(chuàng)建類的新實例,并阿靜對象的實例字段設(shè)與this對象的實例字段完全一致。返回對新實例的引用。 Finalize: 在垃圾回收器判斷對象作為垃圾被回收之后,在對象的內(nèi)存被實際回收之前,會調(diào)用這個虛方法。需要在回收前執(zhí)行清理工作的類型應(yīng)重寫該方法。

轉(zhuǎn)載于:https://www.cnblogs.com/yankun1991/p/6992271.html

總結(jié)

以上是生活随笔為你收集整理的System.Object简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。