公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

四種C#對(duì)象的比較方式

admin
2025年4月28日 13:3 本文熱度 440

在C#中比較兩個(gè)對(duì)象是否相等,通常有四種主要方式

1、ReferenceEquals(object o1, object o2):

  • 靜態(tài)方法:比較兩個(gè)對(duì)象的引用,引用相同返回true,否則返回false,同為null是返回true;ReferenceEquals進(jìn)行值類型比較時(shí)總是返回false,因?yàn)閮蓚€(gè)值類型需要分別裝箱到對(duì)象中,是不同的引用?;

  • 從名稱中便可知它用來(lái)比較兩者是否是相同的引用,我們也永遠(yuǎn)不應(yīng)該去重寫該方法。

Person zs = new Person("ZhangSan",28);Person ls = new Person("LiSi",20);Person zsCopy = zs;
//ReferenceEquals比較兩個(gè)對(duì)象的引用,同為null是返回true Console.WriteLine("ReferenceEquals(zs, ls) : " + ReferenceEquals(zs, ls)); // FalseConsole.WriteLine("ReferenceEquals(zs, zsCopy) : " + ReferenceEquals(zs, zsCopy)); //TrueConsole.WriteLine("ReferenceEquals(ls, zsCopy) : " + ReferenceEquals(ls, zsCopy)); //FasleConsole.WriteLine("ReferenceEquals(null, null) : " + ReferenceEquals(null, null)); //TrueConsole.WriteLine("ReferenceEquals(zs, null) : " + ReferenceEquals(zs, null)); //FalseConsole.WriteLine("ReferenceEquals(1, 1) : " + ReferenceEquals(1, 1)); //False

2、Equals(object o):

  • 虛方法:比較兩個(gè)對(duì)象的引用,由于是虛方法所以可以在自己的類中重寫它,按值來(lái)比較對(duì)象

  • 重寫Equals應(yīng)該遵循的原則:自反性、對(duì)稱性、傳遞性。即:a=a;若a=b,則b=a;若a=b,b=c,則a=c;另外兩個(gè)對(duì)象要么相等要不不等,所以該方法不應(yīng)該拋出異常;

Person zs = new Person("ZhangSan",28);Person ls = new Person("LiSi",20);Person zsCopy = zs;
//虛擬Equals方法,比較引用,可以重寫比較值 Console.WriteLine("zs.Equals(ls) : " + zs.Equals(ls)); //FasleConsole.WriteLine("zs.Equals(zsCopy) : " + zs.Equals(zsCopy)); //TrueConsole.WriteLine("ls.Equals(zsCopy) : " + ls.Equals(zsCopy)); //FalseConsole.WriteLine("zs.Equals(null) : " + zs.Equals(null)); //FalseConsole.WriteLine("1.Equals(1) : " + 1.Equals(1)); //True?

3、Equals(object o1, object o2)

  • 靜態(tài)方法:比較兩個(gè)對(duì)象的引用,先判斷兩個(gè)對(duì)象是否為空,如果都不為空,則調(diào)用虛擬Equals方法;

Person zs = new Person("ZhangSan",28);Person ls = new Person("LiSi",20);Person zsCopy = zs;
//靜態(tài)Equals方法先比較兩個(gè)對(duì)象是否為空,如果都不為空,則調(diào)用虛擬Equals方法 Console.WriteLine("Person.Equals(zs, ls) : " + Person.Equals(zs, ls)); //FalseConsole.WriteLine("Person.Equals(zs, zsCopy) : " + Person.Equals(zs, zsCopy)); //TrueConsole.WriteLine("Person.Equals(ls, zsCopy) : " + Person.Equals(ls, zsCopy)); //FalseConsole.WriteLine("Person.Equals(null, null) : " + Person.Equals(null, null)); //TrueConsole.WriteLine("Person.Equals(zs, null) : " + Person.Equals(zs, null)); //FasleConsole.WriteLine("Person.Equals(1, 1) : " + Person.Equals(1, 1)); //True

4、object1 == object2:

  • 比較運(yùn)算符:可以重寫;對(duì)于引用類型,默認(rèn)是比較引用的(System.String除外)來(lái)源,對(duì)于值類型默認(rèn)比較值;

  • 對(duì)于自定義的結(jié)構(gòu),如果不顯示重載operator方法,則無(wú)法使用。

  • 由于在C#中要求比較運(yùn)算符必須成對(duì)重載,重載==運(yùn)算符的同時(shí)也必須重載!=運(yùn)算符,否則也會(huì)產(chǎn)生編譯錯(cuò)誤。

  • 如果要重載的話,運(yùn)算符"=="、"!="?與?Equals方法、GetHashCode方法應(yīng)該同時(shí)被重載,因?yàn)樗麄儜?yīng)該保持同樣的相等邏輯。但不要再==中調(diào)用Equals,最好是在Equals中調(diào)用==。

Person zs = new Person("ZhangSan",28);Person ls = new Person("LiSi",20);Person zsCopy = zs;String str1 = "Hello";String str2 = "Hello";String str3 = str1;
//比較運(yùn)算符比較引用,可以重寫 Console.WriteLine("zs == ls : " + (zs == ls)); //FalseConsole.WriteLine("zs == zsCopy : " + (zs == zsCopy)); //TrueConsole.WriteLine("ls == zsCopy : " + (ls == zsCopy)); //FalseConsole.WriteLine("zs == null : " + (zs == null)); //FalseConsole.WriteLine("1 == 1 : " + (1 == 1)); //TrueConsole.WriteLine("str1 == str2 :" + (str1 == str2));//TrueConsole.WriteLine("str1 == str3 :" + (str1 == str3));//TrueConsole.WriteLine("str2?==?str3?:"?+?(str2?==?str3));//True

Equals(object?o)與==的區(qū)別

1) ==操作符判斷的是堆棧中的值,Equlas判斷的是堆中的值。

2) C#提供值類型和引用類型:

    • 值類型存儲(chǔ)在棧上,故用==判斷是直接判斷其值是否相等,因?yàn)橹殿愋筒淮嬖诙阎械臄?shù)據(jù),因此值類型的Equals也是判斷數(shù)據(jù)。即,對(duì)于值類型而言,==與Equals相同,均是判斷其值是否相等。

    • 對(duì)于引用類型而言,其棧中存儲(chǔ)的是對(duì)象的地址,那么==就是比較兩個(gè)地址是否相等,即是否指向同一個(gè)對(duì)象;Equals則是比較兩個(gè)對(duì)象在堆中的數(shù)據(jù)是否一樣,即兩個(gè)引用類型是否是對(duì)同一個(gè)對(duì)象的引用。

?3) String類型特殊:

  • String類型雖然是引用類型,但是對(duì)String對(duì)象的賦值卻按照值類型操作

  • 對(duì)str2初始化的時(shí)候,并沒有重新開辟內(nèi)存,而是直接將其地址指向str1的內(nèi)容“hello”。這樣一來(lái),string類型雖然是引用類型,但是其==操作和Equals操作都是一樣的,均比較值是否相等。

4) 與GetHashCode()的關(guān)系

  • 若兩對(duì)象Equals相等,那么其GetHashCode()必定相等;但是反過來(lái),若GetHashCode()相等,那么這兩個(gè)對(duì)象Equals方法比較結(jié)果不一定相同。(為了獲取最佳性能,hash函數(shù)為對(duì)象內(nèi)容生成的數(shù)字是隨機(jī)分布的,這就意味著,內(nèi)容不同的對(duì)象,有可能生成的數(shù)字是一樣的,但可以認(rèn)為這種概率非常小)。

出處:cnblogs.com/LXLR/archive/2023/07/16/17558349.html?

作者:LXLR


該文章在 2025/4/28 13:07:45 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产成年女人特黄特色大片免费 | av在线免费观看 | 91精品国产亚洲爽啪在线观看 | 91一码二码区别在哪儿啊 | 国产午夜免费啪视频观看视频 | 国产在线精品一区二区中文 | 精品亚洲成av人在线观看 | 97午夜理论电影影院 | 国产精品一区一区三区在线 | ā片在线观看免费看无码 | 高朝久久久久久久久久 | 国产69精品久久久久观看软件 | 国产娇喘喷水呻吟在线观看 | 国产无套抽出白浆来 | 国产高清无码日韩一区擁有海量影 | 国产一区一二区高清不卡 | 国产在线精品一区二区三区直 | 国产精品国产三级国av在线观看 | 精品国产v无码大片在线观看视色 | av网站永久 | 成人国产一区二区三区香蕉 | 91福利免费体 | 国产精品嫩草影院在线 | 变态潮喷失禁大喷水 | 精品无码秘人妻一区二区 | 国产成人精品免费播放 | 岛国在线永久免费视频 | 国产在线精品99 | 91在线国产在线观看高清 | 高潮喷水波多野结衣在线观看 | 国产精品一区二区av综合 | 国产一级毛片电影 | 国产精品无码三级久久久天美传媒 | 91亚洲伦理在线观看 | 国产av演绎护士 | 91视频精品安全吗 | 国产精品女人伦一区二区三区 | 精品日韩av一区二区三区 | 国产av无码专区亚洲八aⅴ | 国产麻豆成人av色影视 | 国产成人av国语在线观看18 |