国产高清在线免费观看-国产高清在线免费无码-国产高清在线男人的天堂-国产高清在线视频-国产高清在线视频精品视频-国产高清在线视频伊甸园

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

四種C#對象的比較方式

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

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

1、ReferenceEquals(object o1, object o2):

  • 靜態方法:比較兩個對象的引用,引用相同返回true,否則返回false,同為null是返回true;ReferenceEquals進行值類型比較時總是返回false,因為兩個值類型需要分別裝箱到對象中,是不同的引用?;

  • 從名稱中便可知它用來比較兩者是否是相同的引用,我們也永遠不應該去重寫該方法。

Person zs = new Person("ZhangSan",28);Person ls = new Person("LiSi",20);Person zsCopy = zs;
//ReferenceEquals比較兩個對象的引用,同為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):

  • 虛方法:比較兩個對象的引用,由于是虛方法所以可以在自己的類中重寫它,按值來比較對象

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

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)

  • 靜態方法:比較兩個對象的引用,先判斷兩個對象是否為空,如果都不為空,則調用虛擬Equals方法;

Person zs = new Person("ZhangSan",28);Person ls = new Person("LiSi",20);Person zsCopy = zs;
//靜態Equals方法先比較兩個對象是否為空,如果都不為空,則調用虛擬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:

  • 比較運算符:可以重寫;對于引用類型,默認是比較引用的(System.String除外)來源,對于值類型默認比較值;

  • 對于自定義的結構,如果不顯示重載operator方法,則無法使用。

  • 由于在C#中要求比較運算符必須成對重載,重載==運算符的同時也必須重載!=運算符,否則也會產生編譯錯誤。

  • 如果要重載的話,運算符"=="、"!="?與?Equals方法、GetHashCode方法應該同時被重載,因為他們應該保持同樣的相等邏輯。但不要再==中調用Equals,最好是在Equals中調用==。

Person zs = new Person("ZhangSan",28);Person ls = new Person("LiSi",20);Person zsCopy = zs;String str1 = "Hello";String str2 = "Hello";String str3 = str1;
//比較運算符比較引用,可以重寫 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)與==的區別

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

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

    • 值類型存儲在棧上,故用==判斷是直接判斷其值是否相等,因為值類型不存在堆中的數據,因此值類型的Equals也是判斷數據。即,對于值類型而言,==與Equals相同,均是判斷其值是否相等。

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

?3) String類型特殊:

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

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

4) 與GetHashCode()的關系

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

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

作者:LXLR


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

主站蜘蛛池模板: bl肉文推荐失禁 | 亚洲av无码一区二区三区在线二区 | 国产精品女主播主要 | 被工地工人轮着上雯雯 | 国产精品日本欧美一区二 | 日本欧美一区二区三区片 | 精品国偷自产在线 | 在线观看成人无码视频 | 无码人妻精品1国产婷婷 | 性色AV爽歪歪啪啪A片 | 色欲综合视频天天天 | 国产丝袜啪啪 | 国产超高清麻豆精品传媒麻豆精品 | 97momo| 国内精品久久久久久久影视麻豆 | 国产一级特黄aaa大片 | 99热久久是有精品首页 | 亚精产品一三三菠萝蜜 | 亚洲av无码国产精品久久不卡 | 久久窝窝国产精品午夜看15 | 日韩欧美国产精品综合一区二区三区久久 | 亚洲自拍中文字幕 | 亚洲无av码一区二区三区 | 一区二区三区91 | 国产毛片无码视频 | 日韩色情图片AV一区 | 无码人妻一区二区三区在线视频 | 亚洲精品无码久久久 | 人妻精品丰满熟妇区 | 自偷自拍亚洲综合精品 | 成人国产午夜在线视频 | 国产日韩欧美一区二区乱码 | 亚洲成人久久久精品 | 国产精品人人做人人爽人人添 | 人妻少妇久久久久久 | 伊人影院五月天入口 | 亚洲欧美自拍偷一区二区 | 日本熟妇乱人伦A片精品软件 | 亚洲国产精品视频 | 欧洲在线观看福利午夜电影 | 亚洲精品国产aⅴ综合第一己 |