最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中Equality和Identity淺析

 更新時間:2014年12月08日 11:32:30   投稿:junjie  
這篇文章主要介紹了C#中Equality和Identity淺析,本文先是講解了Equality和Identity的定義,同時講解了判斷兩個對象等價性的4種方法,需要的朋友可以參考下

CLR提供了可以區(qū)分類型的Equality 和Identity能力。

Equality:如果兩個對象是相同的類型,并且它們各自帶有相同和等值的屬性。(They are instances of the same type and if each of the fields in one object matches the values of the fields in the other object)

Equality必須滿足三個必要條件:reflexive, symmetrics, and transitive
reflexive: 自身相等,及a==a 是永遠(yuǎn)成立的;
symmetrics: 對象性,及a==b成立那么b==a 也成立;
transitive: 傳遞性,及a==b, b==c成立那么a==c 也成立。

Identity:兩個對象必須相等(意味著他們共享同一塊內(nèi)存區(qū)域)(The two objects have the same values. – Two objects are identical if they share an address in memory)

CLR提供了至少四種方法來判斷兩個對象的等價性:

1.Public static bool ReferenceEquals(object left, object right);
2.Public static bool Equals(object left, object right);
3.Public virtual bool Equals(object right);
4.Public static bool operator==(MyClass left, MyClass right);

ReferenceEquals方法總是用來判斷兩個對象的Identity的,不管是針對值類型還是引用類型。所以針對值類型,調(diào)用該方法總是會返回false,因為值類型作為這個方法的參數(shù)時會進(jìn)行裝箱操作。

靜態(tài)的Equals方法提供了判斷兩個對象的Equality能力,在其實現(xiàn)的內(nèi)部,調(diào)用了上述第三個虛擬的Equals方法。和ReferenceEquals一樣,它們已經(jīng)具備從底層判斷兩個對象的能力,我們從來不會覆寫這兩個方法。

實例Equals方法也是用來區(qū)分兩個對象的Equality的。

對于引用類型的對象,它和ReferenceEquals方法幾乎是一樣的。(因為判斷兩個引用類型是否的Equality往往從Identity上就可以區(qū)分)

而值類型的對象,我們不僅要判斷他們具有相同的對象類型,還要判斷他們的值相等。值類型從System.ValueType繼承而來,ValueType已經(jīng)重寫了Object.Equals()方法,本來已經(jīng)可以用來滿足這些要求的。但是ValueType.Equals()方法不是很有效,因為它必須要通過反射,在不知道具體的派生類型中,完成對它們所含有成員變量的值的比較。因此,建議在我們實現(xiàn)一個值類型的數(shù)據(jù)結(jié)構(gòu)時,同時重寫ValueType.Equals()方法。

然而我們再回頭看看引用類型,有時兩個引用類型的對象往往被用來進(jìn)行類似值類型的比較,比如:String類型,它雖然是引用類型,但它也重寫了Equals方法,因為我們拿它來判斷兩個string是否相同(Equality),實際是希望判斷它們是否具有相同的內(nèi)容,這是一個value semantics。因此,我們建議在考慮實現(xiàn)一個用作值語義環(huán)境下的引用類型時候,也重寫基類的Object.Equals()方法。

注:請參考MDSN或其它相關(guān)文檔,如何實現(xiàn)Equals方法的重寫。

上面的圖示給了很好的例子來區(qū)分Equals和ReferenceEquals方法,被用來做Equility和Identity判斷的區(qū)別。

\== 運(yùn)算符是可由類重載的運(yùn)算符,它也是用來判斷恒等的。 對于未重載= =的引用類型,會比較兩個引用類型是否引用同一個對象。這跟引用類型的Equals()方法是一樣的。

對于未重載= =的值類型,該運(yùn)算符會比較這兩個值是否"按位"相等,即是否這兩個值中的每個字段都相等。和Equals方法一樣,推薦在自定義值類型中,也要重載= =運(yùn)算符,因為也存在反射在效率上的影響。

\== 運(yùn)算符和Equals方法的區(qū)別在于多態(tài)表現(xiàn)上。Equals方法是重寫,而= =運(yùn)算符是被重載。這意味著除非編譯器知道調(diào)用具體的重載版本,否則它只是調(diào)用未重載的= =版本。

相關(guān)文章

  • C#適用于like語句的SQL格式化函數(shù)

    C#適用于like語句的SQL格式化函數(shù)

    這篇文章主要介紹了C#適用于like語句的SQL格式化函數(shù),可實現(xiàn)對字符串進(jìn)行sql格式化,并且符合like查詢的格式,非常實用,需要的朋友可以參考下
    2014-10-10
  • C#批量更新sql實例

    C#批量更新sql實例

    這篇文章主要介紹了C#批量更新sql的方法,詳細(xì)講述了其實現(xiàn)步驟與對應(yīng)的核心代碼,非常實用,需要的朋友可以參考下
    2014-10-10
  • C#定時器實現(xiàn)自動執(zhí)行的方法

    C#定時器實現(xiàn)自動執(zhí)行的方法

    這篇文章主要介紹了C#定時器實現(xiàn)自動執(zhí)行的方法,實例分析了C#定時器參數(shù)的設(shè)置及方法的調(diào)用與實現(xiàn),需要的朋友可以參考下
    2015-01-01
  • C#難點(diǎn)逐個擊破(4):main函數(shù)

    C#難點(diǎn)逐個擊破(4):main函數(shù)

    貌似我是在寫C#的學(xué)習(xí)筆記哦,不過反正可以利用這個機(jī)會來好好溫習(xí)下基礎(chǔ)知識,這其中很多知識點(diǎn)都屬于平時視而見的小知識
    2010-02-02
  • C#通過chrome插件將HTML網(wǎng)頁轉(zhuǎn)換為PDF

    C#通過chrome插件將HTML網(wǎng)頁轉(zhuǎn)換為PDF

    這篇文章主要介紹了C#通過chrome插件將HTML網(wǎng)頁轉(zhuǎn)換為PDF,將HTML網(wǎng)頁內(nèi)容轉(zhuǎn)換為 PDF 格式能方便文檔的后續(xù)打印、存檔和分享等,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2025-03-03
  • Unity3D實現(xiàn)打磚塊游戲

    Unity3D實現(xiàn)打磚塊游戲

    這篇文章主要為大家詳細(xì)介紹了Unity3D實現(xiàn)打磚塊游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Unity實現(xiàn)手機(jī)搖一搖震動

    Unity實現(xiàn)手機(jī)搖一搖震動

    這篇文章主要為大家詳細(xì)介紹了untiy實現(xiàn)手機(jī)搖一搖震動,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Gridview自動排序功能的實現(xiàn)

    Gridview自動排序功能的實現(xiàn)

    本篇文章主要是對Gridview自動排序功能的實現(xiàn)代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • C#中的Task.Delay()和Thread.Sleep()區(qū)別(代碼案例)

    C#中的Task.Delay()和Thread.Sleep()區(qū)別(代碼案例)

    Task.Delay(),async/await和CancellationTokenSource組合起來使用可以實現(xiàn)可控制的異步延遲。本文通過多種代碼案例給大家分析C#中的Task.Delay()和Thread.Sleep()知識,感興趣的朋友一起看看吧
    2021-06-06
  • 詳解C#如何判斷字符串的顯示寬度

    詳解C#如何判斷字符串的顯示寬度

    這篇文章主要為大家詳細(xì)介紹了C#判斷字符串的顯示寬度的相關(guān)知識,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下
    2023-11-11

最新評論

肃南| 垣曲县| 元谋县| 崇文区| 安远县| 平果县| 汉源县| 贡山| 游戏| 囊谦县| 米林县| 乌兰察布市| 三江| 石狮市| 滕州市| 治县。| 黑山县| 台南市| 普定县| 嘉鱼县| 黎城县| 澄迈县| 吉林省| 临邑县| 修文县| 霍邱县| 类乌齐县| 东安县| 通榆县| 涪陵区| 武宁县| 甘泉县| 额济纳旗| 都匀市| 两当县| 诸城市| 南宁市| 云龙县| 兴义市| 道孚县| 富民县|