C#判等对象是否相等的方法汇总
作者:shichen2014 发布时间:2023-07-13 22:55:07
标签: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相等,所有整个返回。如下图所示:


猜你喜欢
- 本文实例讲述了C#之Expression表达式树,分享给大家供大家参考。具体实现方法如下:表达式树表示树状数据结构的代码,树状结构中的每个节
- 本文实例为大家分享了Unity实现10天签到系统的具体代码,供大家参考,具体内容如下实现功能:正常在游戏中签到,并把剩下的倒计时给显示出来。
- 这篇文章主要介绍了JAVA利用递归删除文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 前言不知道你是否参加过拼多多上邀请微信好友砍价功能,这个功能实现首先需要考虑的就是获取微信用户的信息。获取用户信息就是获取公众号下微信用户的
- 1,从System.String[]转到List<System.String>System.String[] str={&quo
- 学生模块功能比较少,就是进行考试和查看自己成绩两个大的功能。学生进行考试的功能比较复杂(首先做了校验,不在考试时间范围内,不能进行考试)考试
- 本文实例为大家分享了flutter实现底部导航栏切换的具体代码,供大家参考,具体内容如下思路:MaterialApp是提供了bottomna
- 前言本文将使用Maven、gRPC、Protocol buffers、Docker、Envoy等工具构建一个简单微服务工程,笔者所使用的示例
- 前言前一阵项目中的上传图片改为上传到阿里上,记录一下实现的过程,方便以后查看。参考资料:官方文档配置Android studio添加依赖de
- 一、前期工作创建工作空间 二、创建工作包创建完成后,文件夹的格式为:三、准备编译文件和代码3.1 更换编译文件中的内容将上图中的,
- 1.背景倒计时的效果在网站或其他平台看到的很多了吧,今天就让我们来看看在OpenHarmony中如何实现它吧!2.效果预览视频效果演示传送门
- 想用java做一个像windows里一样的txt编辑软件,涉及到字体设置选项卡,在网上找了很久都没找到,就生气啦自己写一个,现在贴这里分享一
- activity_main.xml在res/layout文件中,放置一个TextView控件用于显示购物商城界面的标题,放置一个ListVi
- 1、在build.gradle(Module)里引入依赖,然后重构(sync Now):android { ...
- 常量,顾名思义,就是“不会改变的量”。我们平时书写的数字(比如12.85)、字符(比如'F')、字符串(比如"谢谢
- Service翻译成中文是服务,熟悉Windows 系统的同学一定很熟悉了。Android里的Service跟Windows里的Servic
- 重写 equals()方法 和 hashCode()方法最近看了学习了集合的简单的知识,碰到了讲解 Set 的部分,感觉很好奇,这里对于 S
- 公钥与私钥公钥与私钥是成对的,一般的,我们认为的是公钥加密、私钥解密、私钥签名、公钥验证,有人说成私钥加密,公钥解密时不对的。公钥与私钥的生
- Android自定义View实现等级滑动条的实例实现效果图:思路: 首先绘制直线,然后等分直线绘制点; 绘制点的时候把X值存到集
- 动态数据源在很多具体应用场景的时候,我们需要用到动态数据源的情况,比如多租户的场景,系统登录时需要根据用户信息切换到用户对应的数据库。又比如