国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#判等對象是否相等的方法匯總

2020-01-24 02:32:13
字體:
來源:轉載
供稿:網友

本文以實例形式展示了C#判等對象是否相等的常用方法,非常實用,可供大家參考借鑒之用。具體分析如下:

一、判斷相等的3個方法

1.實例方法

public virtual bool Equals(object obj) {   return RuntimeHelpers.Equals(this, obj); }

2.比較值類型靜態方法

public static bool Equals(object objA, object objB) {   return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB))); }

3.比較引用類型靜態方法

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;     }   } 

運行結果:

false
false

分析:引用類型比較的是引用地址,由于t1和t2指向不同的對象實例,所以dou都返回false。  

三、判斷值類型是否相等

1.值類型判斷方法

派生于System.ValueType,對System.Object中的虛方法Equals(object obj)進行了重寫

public override bool Equals(object obj) {   if (obj == null)   {     return false;   }   RuntimeType type = (RuntimeType) base.GetType();   RuntimeType type2 = (RuntimeType) obj.GetType();   if (type2 != type) //比較兩個對象是否是同一類型   {     return false;   }   object a = this;   if (CanCompareBits(this)) //對象成員如果存在對于堆的引用返回false   {     return FastEqualsCheck(a, obj);   }   //反射獲取值類型的所有字段   FieldInfo[] fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);   for (int i = 0; i < fields.Length; i++) //遍歷字段,對各個字段進行比較   {     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();     }

出現編譯錯誤。原因是值類型不能用==進行判斷。

3.用Equals()實例方法判斷是否相等

    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,當然,值類型的字段有不相等,就會整個不相等。

4.判斷復雜值類型是否相等

即值類型中包含引用類型和值類型。

  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,會遍歷比較引用類型成員和值類型成員。在nt1和nt2中,類型為Team的引用類型成員_team指向同一個對象實例,  類型為TeamStruct的值類型成員_structTeam相等,所有整個返回。如下圖所示:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 中山市| 波密县| 堆龙德庆县| 卫辉市| 廉江市| 彩票| 扎鲁特旗| 镇巴县| 余江县| 万全县| 屯昌县| 翁牛特旗| 宁安市| 明光市| 道孚县| 衢州市| 垣曲县| 乌兰察布市| 筠连县| 宜兰市| 育儿| 正镶白旗| 红原县| 涟水县| 河西区| 隆子县| 瑞丽市| 滨州市| 胶南市| 宜兰县| 凌海市| 上林县| 清水县| 潼南县| 宜兰县| 南京市| 淳安县| 榆中县| 四平市| 黄山市| 厦门市|