欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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 是永遠成立的;
symmetrics: 對象性,及a==b成立那么b==a 也成立;
transitive: 傳遞性,及a==b, b==c成立那么a==c 也成立。

Identity:兩個對象必須相等(意味著他們共享同一塊內存區(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的,不管是針對值類型還是引用類型。所以針對值類型,調用該方法總是會返回false,因為值類型作為這個方法的參數時會進行裝箱操作。

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

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

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

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

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

注:請參考MDSN或其它相關文檔,如何實現Equals方法的重寫。

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

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

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

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

相關文章

  • C#最小二乘法擬合曲線成直線的實例

    C#最小二乘法擬合曲線成直線的實例

    這篇文章主要介紹了C#最小二乘法擬合曲線成直線的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C#使用有道ip地址查詢接口方法實例詳解

    C#使用有道ip地址查詢接口方法實例詳解

    這篇文章主要介紹了C#使用有道ip地址查詢接口方法,實例分析了有道IP地址查詢接口的使用方法與數據返回格式,需要的朋友可以參考下
    2015-05-05
  • C# MemoryStream類案例詳解

    C# MemoryStream類案例詳解

    這篇文章主要介紹了C# MemoryStream類案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • c# wpf如何更好的使用Application程序集資源

    c# wpf如何更好的使用Application程序集資源

    這篇文章主要介紹了c# wpf如何更好的使用Application程序集資源,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-04-04
  • C#的XML兩種代碼注釋實例說明

    C#的XML兩種代碼注釋實例說明

    在C/C++,JAVA中,有兩種注釋,一種是單行注釋,即兩根反斜杠(//),另一種是多行注釋,即以/*開頭,以*/結尾,本文將詳細介紹,需要的朋友可以參考下
    2012-12-12
  • C#類的成員之Field字段的使用

    C#類的成員之Field字段的使用

    本文主要介紹了C#類的成員之Field字段的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • C#使用StringBuilder實現高效處理字符串

    C#使用StringBuilder實現高效處理字符串

    這篇文章主要為大家詳細介紹了C#如何使用StringBuilder實現高效處理字符串,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-01-01
  • 打開一個Unity工程步驟

    打開一個Unity工程步驟

    這篇文章講述了如何打開一個Unity工程,包含詳細的圖文介紹的步驟,希望本文對你有所幫助
    2021-06-06
  • C#字符串內存分配與駐留池學習分享

    C#字符串內存分配與駐留池學習分享

    這篇文章主要介紹了C#字符串內存分配與駐留池學習分享,大家參考使用吧
    2013-12-12
  • 在 C# 中使用 插值字符串

    在 C# 中使用 插值字符串

    這篇文章主要介紹了在 C# 中使用 插值字符串,字符串插值是一種將 表達式 插入到字符串字面量中的一種技術,又稱為變量替換,變量插值,變量展開 等等,它是一種用相應值替換字符串中的一個或者更多個占位符的處理過程
    2022-01-01

最新評論