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

c#?復寫Equals方法的實現(xiàn)

 更新時間:2022年05月12日 10:05:55   作者:桃花換小魚干兒  
本文主要介紹了c#?復寫Equals方法的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

應用情景:

很多標準的方法都是利用Object.Equals方法來做對比的,例如LIst.Remove

假設 某些情景下我們希望引用類型判斷“相等”時不去看地址是不是同一個,而是看某些屬性是不是一樣就可以了。(例如身份證ID是一個就認為是同一個人)

復寫方法如下范例所示:

Main{
    List<People> nList = new List<People> { new People( 1 ), new People( 2 ), new People( 3 ) };
    People onePeople = new People( 1 );
    nList.Remove( onePeople );
 
}
 
 
class People
{
    public People( int nID )
    {
        ID = nID;
    }
    int ID;
 
    public override bool Equals( object obj )
    {
        return Equals( obj as People );
    }
 
    bool Equals( People other )
    {
        return other != null 
            && ID == other.ID;
    }
 
}

P.s. 最好也重新overide GetHashCode方法:
(7跟13只是常用的手法,拿質數(shù)來乘,確保hash code是獨一無二),也可以加入 ^ 計算

public override int GetHashCode()
{
    int hash =13;
    hash = (hash * 7) + ID== null ? 0 : ID.GetHashCode();
}

原因是:

1.Equal是判斷是否指向同一個地址
2.每個對象都會有一個獨一無二的HashCode
一旦override了Equal方法,卻不override GetHashCode方法會導致兩個判斷為相同(利用Equal判斷)的對象,Hash值卻不同。
承上,在使用到HashCode的地方(例如Dictionary中的key),兩個相同對象可能會被重復加入到Dictionary中

什么時候需要重寫 Equals() 方法

引用類型:

只有當需要修改該引用類型所定義的語義時,才應該重寫實例版本的 Equals() 方法。如果類型需要采用值語義而不是引用語義(或者說,需要按照對象內容而不是對象身份來進行比較),那么就應該針對這個類型重寫實例版本的 Object.Equals() 方法。

引用類型一般不需要重寫 operator==()。

值類型:

創(chuàng)建值類型的時候,總是應該針對這個類型重寫 ValueType.Equals() 方法。
因為值類型都繼承自 System.ValueType 類,System.ValueType 類默認通過反射來實現(xiàn)比較,效率不夠高。

值類型中默認的 == 運算符會默認通過反射進行比較,因此,也應該重寫 == 操作符。

重寫 Equals() 方法時的注意事項

Equals() 方法必須滿足等同關系的 3 項數(shù)學性質:自反性、對稱性、可傳遞性。
Equals() 方法決不應該拋出異常。
重寫 Equals() 方法時,只有在基類型的 Equals(object) 不是由 System.Object 或 System.ValueType 所提供的情況下,才需要調用基類型的版本。
重寫 Equals() 的時候,還應該讓該類型實現(xiàn) IEquatable<T> 接口。
重寫 Equals() 方法后,通常應該同時重寫 GetHashCode() 方法。

重寫 GetHashCode() 方法時的注意事項

如果 Equals() 方法認定兩個對象相等,那么這兩個對象的 HashCode 也必須相同;
對任意對象來說,其 HashCode 必須在生命周期內保持不變;
HashCode 計算方法應該將其值均勻地映射到各個整數(shù)上,避免堆集。
一種常用的 HashCode 算法是:對類型中的每個相互獨立的不可變字段調用 GetHashCode() 方法,并對返回的 HashCode 進行異或(XOR)運算,將得到的最終結果作為對象本身的 HashCode 。

到此這篇關于c# 復寫Equals方法的實現(xiàn)的文章就介紹到這了,更多相關c# 復寫Equals內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C#調用C類型dll入參為struct的問題詳解

    C#調用C類型dll入參為struct的問題詳解

    這篇文章主要給大家介紹了關于C#調用C類型dll入參為struct問題的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • WCF和Remoting之間的消息傳輸

    WCF和Remoting之間的消息傳輸

    這篇文章介紹了WCF和Remoting之間的消息傳輸,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • 用C#把文件轉換為XML的代碼

    用C#把文件轉換為XML的代碼

    用C#把文件轉換為XML的代碼...
    2007-03-03
  • C#?WPF?ListBox?動態(tài)顯示圖片功能

    C#?WPF?ListBox?動態(tài)顯示圖片功能

    這篇文章主要介紹了C#?WPF?ListBox?動態(tài)顯示圖片,處理過程分為前臺代碼和后臺代碼,本文結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • C#中分部類和分部方法的應用

    C#中分部類和分部方法的應用

    本篇文章介紹了,C#中分部類和分部方法的應用。需要的朋友參考下
    2013-04-04
  • C#對list列表進行隨機排序的方法

    C#對list列表進行隨機排序的方法

    這篇文章主要介紹了C#對list列表進行隨機排序的方法,涉及C#操作list列表的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • .NET中的async和await關鍵字使用及Task異步調用實例

    .NET中的async和await關鍵字使用及Task異步調用實例

    這篇文章主要介紹了.NET中的async和await關鍵字使用及Task異步調用實例,本文還包含了取消執(zhí)行和顯示進度的例子,需要的朋友可以參考下
    2014-07-07
  • C#?輸出參數(shù)out問題

    C#?輸出參數(shù)out問題

    這篇文章主要介紹了C#?輸出參數(shù)out問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C# 如何調用C++ dll string類型返回

    C# 如何調用C++ dll string類型返回

    這篇文章主要介紹了C# 如何調用C++ dll string類型返回問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C#使用HttpWebRequest重定向方法詳解

    C#使用HttpWebRequest重定向方法詳解

    在本篇內容里小編給讀者們整理了關于C#使用HttpWebRequest重定向方法和相關知識點,需要的朋友們參考下。
    2019-03-03

最新評論