C#判等对象是否相等的方法汇总

本文以实例形式展示了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相等,所有整个返回。如下图所示:

(0)

相关推荐

  • 浅谈对c# 面向对象的理解

    一.了解面向对象 1.概念基本理解:1).一个个体可以看做是一个对象,例如:人这个个体: 2).有共同属性的一类作为一个个体,例如:学生.白领.农民工: 3).结构体是用户自定义的数据类型,可以定义不同数据类型的变量,结构体也是面向对象的核心: 2.基本特性: 1)封装:是隐藏信息的特性,具有"封装"意识,是掌握面向对象分析与设计技巧的关键. 最简单的理解:创建一个对象的整体,使对象的属性可以具有赋值.取值的功能,也就是对象中的变量可以赋值.取值.,是一种认为的抽象出来的对象的概念.

  • C#实现实体类与字符串互相转换的方法

    本文实例讲述了C#实现实体类与字符串互相转换的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.Text; namespace PackDLL.Data.ConvertData { /// <summary> /// 实体类.字符串互相转换 /// </summary> public class PackReflectionEntity<T> { //

  • C#对象与XMl文件之间的相互转换

    C#提供三种序列化方式,分别为:1.是使用BinaryFormatter进行串行化: 2.使用SoapFormatter进行串行化: 3.使用XmlSerializer进行串行化.其中对于BinaryFormatter的方式需要实现ISerializable接口,而XmlSeriializ不需要实现对应的接口,可以直接序列化.在这里面我们主要采用XMlSerialize来实现对应的序列化操作进而实现对应的对象和XMl文件之间的转换关系. 在通过序列化实现对应的转换关系操作的功能时,我首先创建了D

  • c# DataTable与不同结构实体类转换的方法实例

    在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我们怎么处理呢?可能有人会说,在转换时创建一个实体对象,对表里的数据逐行遍历来实例化这个实体对象不就完了.的确没错,这方法可行,但是这个方法效率极低,遇到亿万数据的话那就要实例化亿万个对象,由此可见它的效率了.先看一下我的实体类 复制代码 代码如下: /// <summary>/// 具体的实体类,和数据表中不同/// </summary>public class Person{    [D

  • C# 面向对象的基本原则

    C#面向对象的基本原则 一.面向接口编成而不是实现 [Code to an interface rather than to an implementation.] 二.优先使用组合而非继承 [Favor Composition Over Inheritance.] 三.SRP: The single responsibility principle 单一职责 系统中的每一个对象都应该只有一个单独的职责,而所有对象所关注的就是自身职责的完成.[Every object in your syste

  • C# DataTable 转换为 实体类对象实例

    复制代码 代码如下: public class User {         public int ID { get; set; }         public string Name { get; set; } } //对应数据库表: //User //字段:ID.Name 那么你也许需要编写将DataTable 转换为实体对象的方法,便利DataTable.Rows 获得并填充.. 下面是我写的一个通用方法,分享+记录,便于日后直接Copy ~ 复制代码 代码如下: private sta

  • C#实现根据实体类自动创建数据库表

    .Net新手通常容易把属性(Property)跟特性(Attribute)搞混,其实这是两种不同的东西 属性指的类中封装的数据字段:而特性是对类.字段.方法和属性等元素标注的声明性信息 如下代码(Id.Name为User的属性,[DbKey]为Id的特性) /// <summary> /// 用户信息 /// </summary> public class User { [DbKey] public string Id { get; set; } public string Nam

  • C#实现实体类和XML相互转换

    一.实体类转换成XML 将实体类转换成XML需要使用XmlSerializer类的Serialize方法,将实体类序列化 public static string XmlSerialize<T>(T obj) { using (StringWriter sw = new StringWriter()) { Type t= obj.GetType(); XmlSerializer serializer = new XmlSerializer(obj.GetType()); serializer.

  • c#对象反序列化与对象序列化示例详解

    1.对象序列化的介绍 (1).NET支持对象序列化的几种方式二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下.SOAP序列化:对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP 协议传输,通过System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter类来实现的.XML

  • C#编程获取实体类属性名和值的方法示例

    本文实例讲述了C#编程获取实体类属性名和值的方法.分享给大家供大家参考,具体如下: 遍历获得一个实体类的所有属性名,以及该类的所有属性的值 //先定义一个类: public class User { public string name { get; set; } public string gender { get; set; } public string age { get; set; } } //实例化类,并给实列化对像的属性赋值: User u = new User(); u.name

  • C#实现XML与实体类之间相互转换的方法(序列化与反序列化)

    本文实例讲述了C#实现XML与实体类之间相互转换的方法.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Data; using System.Xml; using System.Xml.Serialization; /// <summary> /// Xml序列化与反序列化 //

随机推荐