C#判等對(duì)象是否相等的方法匯總
本文以實(shí)例形式展示了C#判等對(duì)象是否相等的常用方法,非常實(shí)用,可供大家參考借鑒之用。具體分析如下:
一、判斷相等的3個(gè)方法
1.實(shí)例方法
public virtual bool Equals(object obj)
{
return RuntimeHelpers.Equals(this, obj);
}
2.比較值類型靜態(tài)方法
public static bool Equals(object objA, object objB)
{
return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB)));
}
3.比較引用類型靜態(tài)方法
public static bool ReferenceEquals(object objA, object objB)
{
return (objA == objB);
}
二、判斷引用類型是否相等
class Program
{
static void Main(string[] args)
{
Team t1 = new Team("馬爾切洛·里皮");
Team t2 = new Team("馬爾切洛·里皮");
var result = (t1 == t2);
Console.WriteLine(result);
result = t1.Equals(t2);
Console.WriteLine(result);
Console.ReadKey();
}
}
public class Team
{
public string _coach = string.Empty;
public Team(string coach)
{
this._coach = coach;
}
}
public struct TeamStruct
{
public string _coach;
public TeamStruct(string coach)
{
this._coach = coach;
}
}
運(yùn)行結(jié)果:
false
false
分析:引用類型比較的是引用地址,由于t1和t2指向不同的對(duì)象實(shí)例,所以dou都返回false。
三、判斷值類型是否相等
1.值類型判斷方法
派生于System.ValueType,對(duì)System.Object中的虛方法Equals(object obj)進(jìn)行了重寫
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
RuntimeType type = (RuntimeType) base.GetType();
RuntimeType type2 = (RuntimeType) obj.GetType();
if (type2 != type) //比較兩個(gè)對(duì)象是否是同一類型
{
return false;
}
object a = this;
if (CanCompareBits(this)) //對(duì)象成員如果存在對(duì)于堆的引用返回false
{
return FastEqualsCheck(a, obj);
}
//反射獲取值類型的所有字段
FieldInfo[] fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
for (int i = 0; i < fields.Length; i++) //遍歷字段,對(duì)各個(gè)字段進(jìn)行比較
{
object obj3 = ((RtFieldInfo) fields[i]).UnsafeGetValue(a);
object obj4 = ((RtFieldInfo) fields[i]).UnsafeGetValue(obj);
if (obj3 == null)
{
if (obj4 != null)
{
return false;
}
}
else if (!obj3.Equals(obj4))
{
return false;
}
}
return true;
}
2.用==判斷是否相等
static void Main(string[] args)
{
TeamStruct ts1 = new TeamStruct("馬爾切洛·里皮");
TeamStruct ts2 = ts1;
var result = (ts1 == ts2);
Console.WriteLine(result);
Console.ReadKey();
}
出現(xiàn)編譯錯(cuò)誤。原因是值類型不能用==進(jìn)行判斷。
3.用Equals()實(shí)例方法判斷是否相等
static void Main(string[] args)
{
TeamStruct ts1 = new TeamStruct("馬爾切洛·里皮");
TeamStruct ts2 = ts1;
var result = ts1.Equals(ts2);
Console.WriteLine(result);
Console.ReadKey();
}
返回true。
可見,如果值類型的字段相等,那就相等。
static void Main(string[] args)
{
TeamStruct ts1 = new TeamStruct("馬爾切洛·里皮");
TeamStruct ts2 = ts1;
ts2._coach = "高洪波";
var result = ts1.Equals(ts2);
Console.WriteLine(result);
Console.ReadKey();
}
返回false,當(dāng)然,值類型的字段有不相等,就會(huì)整個(gè)不相等。
4.判斷復(fù)雜值類型是否相等
即值類型中包含引用類型和值類型。
class Program
{
static void Main(string[] args)
{
Team t = new Team("馬爾切洛·里皮");
TeamStruct ts = new TeamStruct("馬爾切洛·里皮");
NationalTeam nt1 = new NationalTeam(t, ts);
NationalTeam nt2 = nt1;
var result = nt1.Equals(nt2);
Console.WriteLine(result);
Console.ReadKey();
}
}
public class Team
{
public string _coach = string.Empty;
public Team(string coach)
{
this._coach = coach;
}
}
public struct TeamStruct
{
public string _coach;
public TeamStruct(string coach)
{
this._coach = coach;
}
}
public struct NationalTeam
{
public Team _team;
public TeamStruct _structTeam;
public NationalTeam(Team team, TeamStruct structTeam)
{
this._team = team;
this._structTeam = structTeam;
}
}
返回true,會(huì)遍歷比較引用類型成員和值類型成員。在nt1和nt2中,類型為Team的引用類型成員_team指向同一個(gè)對(duì)象實(shí)例, 類型為TeamStruct的值類型成員_structTeam相等,所有整個(gè)返回。如下圖所示:

- C#實(shí)現(xiàn)實(shí)體類和XML相互轉(zhuǎn)換
- C#實(shí)現(xiàn)根據(jù)實(shí)體類自動(dòng)創(chuàng)建數(shù)據(jù)庫表
- C#實(shí)現(xiàn)XML與實(shí)體類之間相互轉(zhuǎn)換的方法(序列化與反序列化)
- C#實(shí)現(xiàn)實(shí)體類與字符串互相轉(zhuǎn)換的方法
- c# DataTable與不同結(jié)構(gòu)實(shí)體類轉(zhuǎn)換的方法實(shí)例
- C# DataTable 轉(zhuǎn)換為 實(shí)體類對(duì)象實(shí)例
- c#對(duì)象反序列化與對(duì)象序列化示例詳解
- C#對(duì)象與XMl文件之間的相互轉(zhuǎn)換
- 淺談對(duì)c# 面向?qū)ο蟮睦斫?/a>
- C# 面向?qū)ο蟮幕驹瓌t
- C#編程獲取實(shí)體類屬性名和值的方法示例
相關(guān)文章
C# 讀寫自定義的Config文件的實(shí)現(xiàn)方法
本文主要介紹了C# 讀寫自定義的Config文件的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
C# Redis學(xué)習(xí)系列(一)Redis下載安裝使用
這篇文章主要為大家分享了C# Redis學(xué)習(xí)系列教程第一篇, Redis下載、安裝、使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
利用C#/VB.NET實(shí)現(xiàn)PPT轉(zhuǎn)換為HTML
利用PowerPoint可以很方便的呈現(xiàn)多媒體信息,且信息形式多媒體化,表現(xiàn)力強(qiáng)。但難免在某些情況下我們會(huì)需要將PowerPoint轉(zhuǎn)換為HTML格式,本文就為大家整理了轉(zhuǎn)換方法,希望對(duì)大家有所幫助2023-05-05
Winform控件優(yōu)化Paint事件實(shí)現(xiàn)圓角組件及提取繪制圓角的方法
這篇文章主要介紹了Winform控件優(yōu)化Paint事件實(shí)現(xiàn)圓角組件及提取繪制圓角的方法,Windows?11下所有控件已經(jīng)默認(rèn)采用圓角,其效果更好、相對(duì)有著更好的優(yōu)化,只是這是默認(rèn)的行為,無法進(jìn)一步自定義,更多詳情需要的小伙伴可以參考下面文章內(nèi)容2022-08-08

