C#區(qū)別和認(rèn)識(shí)四個(gè)判等函數(shù)_第1頁(yè)
C#區(qū)別和認(rèn)識(shí)四個(gè)判等函數(shù)_第2頁(yè)
C#區(qū)別和認(rèn)識(shí)四個(gè)判等函數(shù)_第3頁(yè)
C#區(qū)別和認(rèn)識(shí)四個(gè)判等函數(shù)_第4頁(yè)
C#區(qū)別和認(rèn)識(shí)四個(gè)判等函數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

.Net有四個(gè)判等函數(shù)?不少人看到這個(gè)標(biāo)題,會(huì)對(duì)此感到懷疑。事實(shí)上確是如此,.Net提供了ReferenceEquals、靜態(tài)Equals,具體類型的Equals以及==操作符這四個(gè)判等函數(shù)。但是這四個(gè)函數(shù)之間有細(xì)微的關(guān)系,改變其中一個(gè)函數(shù)的實(shí)現(xiàn)會(huì)影響到其他函數(shù)的操作結(jié)果。首先要說(shuō)的是Object.ReferenceEquals和Object.Equals這兩個(gè)靜態(tài)函數(shù),對(duì)于它們倆來(lái)說(shuō),是不需要進(jìn)行重寫的,因?yàn)樗鼈円呀?jīng)完成它們所要得做的操作。對(duì)于Object.ReferenceEquals這個(gè)靜態(tài)函數(shù),函數(shù)形勢(shì)如下:publicstaticboolReferenceEquals(objectleft,objectright);這個(gè)函數(shù)就是判斷兩個(gè)引用類型對(duì)象是否指向同一個(gè)地址。有此說(shuō)明后,就確定了它的使用范圍,即只能對(duì)于引用類型操作。那么對(duì)于任何值類型數(shù)據(jù)操作,即使是與自身的判別,都會(huì)返回false。這主要因?yàn)樵谡{(diào)用此函數(shù)的時(shí)候,值類型數(shù)據(jù)要進(jìn)行裝箱操作,也就是對(duì)于如下的形式來(lái)說(shuō)。intn=10;Object.ReferenceEquals(n,n);這是因?yàn)閷?duì)于n這個(gè)數(shù)據(jù)裝箱兩次,而每次裝箱后的地址有不同,而造成Object.ReferenceEquals(n,n)的結(jié)果永遠(yuǎn)為false。對(duì)于第一個(gè)判等函數(shù)來(lái)說(shuō),沒(méi)有什么好擴(kuò)展的,因?yàn)楸旧硪呀?jīng)很好地完成了它所要做的。對(duì)于第二個(gè)Object.Equals這個(gè)靜態(tài)函數(shù),其形式如下:publicstaticboolEquals(objectleft,objectright);按照書中對(duì)它的分析,其大致函數(shù)代碼如下:publicstaticvoidEquals(objectleft,objectright){//Checkobjectidentityif(left==right)returntrue;//bothnullreferenceshandledaboveif((left==null)||(right==null))returnfalse;returnleft.Equals(right);}可以說(shuō),Object.Equals這個(gè)函數(shù)完成判等操作,需要經(jīng)過(guò)三個(gè)步驟,第一步是需要根據(jù)對(duì)象所屬類型的==操作符的執(zhí)行結(jié)果;第二步是判別是否為null,也是和第一步一樣,需要根據(jù)類型的==操作符的執(zhí)行結(jié)果;最后一步要使用到類型的Equals函數(shù)的執(zhí)行結(jié)果。也就是說(shuō)這個(gè)靜態(tài)函數(shù)的返回結(jié)果,要取決于后面要提到的兩個(gè)判等函數(shù)。類型是否提供相應(yīng)的判等函數(shù),成為這個(gè)函數(shù)返回結(jié)果的重要因素。那么對(duì)于Object.Equals這個(gè)靜態(tài)方法來(lái)說(shuō),雖說(shuō)接受參數(shù)的類型也屬于引用類型,但是不同于Object.ReferenceEquals函數(shù),對(duì)于如下的代碼,能得出正確的結(jié)果。intn=10;Debug.WriteLine(string.Format("{0}",Object.Equals(n,n)));Debug.WriteLine(string.Format("{0}",Object.Equals(n,10)));這是因?yàn)樵诖撕瘮?shù)中要用到具體類型的兩個(gè)判等函數(shù),不過(guò)就函數(shù)本身而言,該做的判斷都做了,因此不需要去重載添加復(fù)雜的操作。為了更好的述說(shuō)剩下兩個(gè)函數(shù),先解釋一下等價(jià)的意義。對(duì)于等價(jià)的意義,就是自反、對(duì)稱以及傳遞。所謂自反,即a==a;而對(duì)稱,是a==b,則b==a;傳遞是a==b,b==c,則a==c;理解等價(jià)的意義后,那么在實(shí)現(xiàn)類型的判等函數(shù)也要滿足這個(gè)等價(jià)規(guī)則。對(duì)于可以重載的兩個(gè)判等函數(shù),首先來(lái)介紹的是類型的Equals函數(shù),其大致形式如下:publicoverrideboolEquals(objectright);那么對(duì)于一個(gè)類型的Equals要做些什么操作呢,一般來(lái)說(shuō)大致如下:publicclassKeyData{privateintnData;publicintData{get{returnnData;}set{nData=value;}}publicoverrideboolEquals(objectright){//Checknullif(right==null)returnfalse;//checkreferenceequalityif(object.ReferenceEquals(this,right))returntrue;//checktypeif(this.GetType()!=right.GetType())returnfalse;//converttocurrenttypeKeyDatarightASKeyData=rightasKeyData;//checkmembersvaluereturnthis.Data==rightASKeyData.Data;}}如上增加了一個(gè)類型檢查,即if(this.GetType()!=right.GetType())這部分,這是由于子類對(duì)象可以通過(guò)as轉(zhuǎn)化成基類對(duì)象,從而造成不同類型對(duì)象可以進(jìn)行判等操作,違反了等價(jià)關(guān)系。除此外對(duì)于類型的Equals函數(shù)來(lái),其實(shí)并沒(méi)有限制類型非要屬于引用類型,對(duì)于值類型也是可以重載此函數(shù),但是我并不推薦,主要是Equals函數(shù)的參數(shù)類型是不可變的,也就是說(shuō)通過(guò)此方法,值類型要經(jīng)過(guò)裝箱操作,而這是比較影響效率的。而對(duì)于值類型來(lái)說(shuō),我推薦使用最后一種判等函數(shù),即重載運(yùn)算符==函數(shù),其大致形式如下:publicstaticbooloperator==(KeyDataleft,KeyDataright);對(duì)于一個(gè)值類型而言,其的大致形式應(yīng)該如下:publicstructKeyData{privateintnData;publicintData{get{returnnData;}set{nData=value;}}publicstaticbooloperator==(KeyDataleft,KeyDataright){returnleft.Data==right.Data;}publicstaticbooloperator!=(KeyDataleft,KeyDataright){returnleft.Data!=right.Data;}}由于==操作與!=操作要同步定義,所以在定義==重載函數(shù)的時(shí)候,也要定義!=重載函數(shù)。這也是.Net在判等操作保持一致性。那么對(duì)于最后一個(gè)判等函數(shù),這種重載運(yùn)算符的方法并不適合引用類型。這就是.Net經(jīng)?,F(xiàn)象,去判斷兩個(gè)引用類型,不要用==,而要用某個(gè)對(duì)象的Equals函數(shù)。所以在編寫自己類型的時(shí)候,要保留這種風(fēng)格。那么對(duì)于以上介紹的四種判等函數(shù),會(huì)產(chǎn)生如下類似的對(duì)比表格。操作結(jié)果取決于適用范圍建議Object.ReferenceEquals兩個(gè)參數(shù)對(duì)象是否屬于同一個(gè)引用引用類型不要用它來(lái)判斷值類型數(shù)據(jù)Object.Equals參數(shù)類型自身的判等函數(shù)無(wú)限制考慮裝箱操作對(duì)值類型數(shù)據(jù)產(chǎn)生的影響類型的Equals類型重載函數(shù)無(wú)限制考慮裝箱操作對(duì)值類型數(shù)據(jù)產(chǎn)生的影響類型的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論