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

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

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

應(yīng)用情景:

很多標(biāo)準(zhǔn)的方法都是利用Object.Equals方法來做對(duì)比的,例如LIst.Remove

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

復(fù)寫方法如下范例所示:

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只是常用的手法,拿質(zhì)數(shù)來乘,確保hash code是獨(dú)一無二),也可以加入 ^ 計(jì)算

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

原因是:

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

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

引用類型:

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

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

值類型:

創(chuàng)建值類型的時(shí)候,總是應(yīng)該針對(duì)這個(gè)類型重寫 ValueType.Equals() 方法。
因?yàn)橹殿愋投祭^承自 System.ValueType 類,System.ValueType 類默認(rèn)通過反射來實(shí)現(xiàn)比較,效率不夠高。

值類型中默認(rèn)的 == 運(yùn)算符會(huì)默認(rèn)通過反射進(jìn)行比較,因此,也應(yīng)該重寫 == 操作符。

重寫 Equals() 方法時(shí)的注意事項(xiàng)

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

重寫 GetHashCode() 方法時(shí)的注意事項(xiàng)

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

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

相關(guān)文章

  • .Net WInform開發(fā)筆記(二)Winform程序運(yùn)行結(jié)構(gòu)圖及TCP協(xié)議在Winform中的應(yīng)用

    .Net WInform開發(fā)筆記(二)Winform程序運(yùn)行結(jié)構(gòu)圖及TCP協(xié)議在Winform中的應(yīng)用

    中午沒事,把去年剛畢業(yè)那會(huì)畫的幾張圖翻出來了,大概介紹Winform應(yīng)用程序運(yùn)行的過程,以及TCP協(xié)議在Winform中的應(yīng)用。感興趣的朋友可以了解下;如果有Windows消息機(jī)制等基礎(chǔ),很好理解這兩張
    2013-01-01
  • C# 站點(diǎn)IP訪問頻率限制 針對(duì)單個(gè)站點(diǎn)的實(shí)現(xiàn)方法

    C# 站點(diǎn)IP訪問頻率限制 針對(duì)單個(gè)站點(diǎn)的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄狢# 站點(diǎn)IP訪問頻率限制 針對(duì)單個(gè)站點(diǎn)的實(shí)現(xiàn)方法。小編覺的挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • 使用C#的aforge類庫識(shí)別驗(yàn)證碼實(shí)例

    使用C#的aforge類庫識(shí)別驗(yàn)證碼實(shí)例

    這篇文章主要介紹了使用C#的aforge類庫識(shí)別驗(yàn)證碼實(shí)例,aforge類庫是一個(gè)非常強(qiáng)大的類庫,包括計(jì)算機(jī)視覺與人工智能、圖像處理、神經(jīng)網(wǎng)絡(luò)、遺傳算法、機(jī)器學(xué)習(xí)、機(jī)器人等領(lǐng)域,需要的朋友可以參考下
    2014-08-08
  • 用Linq從一個(gè)集合選取幾列得到一個(gè)新的集合(可改列名)

    用Linq從一個(gè)集合選取幾列得到一個(gè)新的集合(可改列名)

    這篇文章主要介紹了用Linq從一個(gè)集合選取幾列得到一個(gè)新的集合(可改列名),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • C#流類FileStream學(xué)習(xí)使用筆記

    C#流類FileStream學(xué)習(xí)使用筆記

    這篇文章主要介紹了C#流類FileStream學(xué)習(xí)使用筆記,本文直接給出示例代碼,代碼中每一步都有詳細(xì)注釋,需要的朋友可以參考下
    2015-06-06
  • 在C#語言里對(duì)NULL的技術(shù)處理小結(jié)

    在C#語言里對(duì)NULL的技術(shù)處理小結(jié)

    在 C# 中處理 null 值是編寫可靠且可靠的代碼的一個(gè)重要方面,在本文中,我將討論一些在 C# 中處理 null 值的最常用技術(shù),感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • C#編寫SqlHelper類

    C#編寫SqlHelper類

    在C#中使用ADO.NET連接數(shù)據(jù)庫的時(shí)候,每次連接都要編寫連接,打開,執(zhí)行SQL語句的代碼,很麻煩,編寫一個(gè)SqlHelper類,把每次連接都要寫的代碼封裝成方法,把要執(zhí)行的SQL語句通過參數(shù)傳進(jìn)去,可以大大簡(jiǎn)化編碼
    2017-09-09
  • C#如何根據(jù)Model字段名稱自動(dòng)匹配并替換值

    C#如何根據(jù)Model字段名稱自動(dòng)匹配并替換值

    這篇文章主要為大家詳細(xì)介紹了如何使用 C# 反射機(jī)制實(shí)現(xiàn)一個(gè)靈活的模板引擎,能夠根據(jù) Model 字段名稱自動(dòng)匹配并替換模板中的占位符,需要的可以了解下
    2025-04-04
  • C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量二

    C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量二

    這篇文章繼續(xù)介紹了C#數(shù)據(jù)類型和變量,是對(duì)上一篇文章的補(bǔ)充,希望對(duì)大家的學(xué)習(xí)有所幫助。
    2015-10-10
  • 利用C#驗(yàn)證哥德巴赫猜想的示例代碼

    利用C#驗(yàn)證哥德巴赫猜想的示例代碼

    哥德巴赫猜想(Goldbach’s?Conjecture)是數(shù)學(xué)領(lǐng)域的一個(gè)著名猜想,大致內(nèi)容為任何一個(gè)大于2的偶數(shù)都可以表示為兩個(gè)質(zhì)數(shù)之和,下面我們就來看看如何利用C#驗(yàn)證這一猜想呢
    2024-03-03

最新評(píng)論

横山县| 洛宁县| 珲春市| 雅安市| 神木县| 神木县| 赤壁市| 古田县| 登封市| 敖汉旗| 双流县| 拉萨市| 桂平市| 怀宁县| 饶阳县| 东乌| 渑池县| 鄂州市| 扎兰屯市| 赤峰市| 灵山县| 内丘县| 确山县| 合水县| 皮山县| 金溪县| 佛教| 新沂市| 沂源县| 蓬溪县| 女性| 驻马店市| 新晃| 精河县| 张家界市| 贞丰县| 玉山县| 蕉岭县| 漳州市| 扬州市| 贵定县|