重写Object.Equals方法
最近移动平台方面的竞争真是风云涌动,时时刻刻牵动着千万程序员的心,无论ms,苹果,google谁胜谁负都会影响着我们苦逼程序员对未来的规划。我只能默默的期盼ms给点力!不要让我在silverlight上花的功夫白费!废话不多说回归正题。
今天重写Equals方法顺手做个总结,都说好记性不如烂笔头,让自己记忆深刻的同时也分享给大家。重写的时候有几点需要注意的地方先上一段代码,然后我再逐一解释。
Class MyRefType:BaseType
{
RefTyoe refobj; //该字段是一个引用类型
ValType valobj; //该字段是一个值类型
public olverride Boolean Equals(Object obj)
{
if(obj==nulll)return false;
if(this.GetType()!=obj.GetType())return false;
//比较其中的引用类型字段
MyRefType other=(MyRefTyppe)obj;
//比较其中的值类型字段
if(!Object.Equals(refobj,other.refobj)) return false;
if(!valobj.Equals(other.valobj)) return false;
return true;
}
public static Boolean operator==(MyRefType o1,MyRefType o2)
{
return Object.Equals(o1,o2);
}
public static Boolean operator!=(MyRefType o1,MyRefType o2)
{
return !(o1==o2);
}
}
(代码是手敲的 可能有错误)
1、比较引用类型的字段
要比较引用类型的字段,我们应该调用Object的静态方法Equals方法,Object的静态Equals方法是一个比较两个应用类型的辅助方法。下面展示下Object的静态Equals方法的内部实现:
public static Boolean Equals(Object objA,Object objB)
{
//如果objA和objB指向的是同一个对象
if(objA==objB)return true;
if(objA==null || objB==null) return false;
return objA.Equals(objB);
}
所以我们采用这方式即使比较的两个字段出现值为null的情况也不影响代码的正常运行。如果refobj为null,调用refobj.Equalls(other.refobj)将会抛出NullReferenceException异常。Object的静态Equeals这一辅助方法会为我们对出现null的情况做检测。
2.比较值类型的字段
比较两个值类型的字段我们就应该用字段的Equalls方法来进行比较,因为值类型永远不可能为null,并且值类型调用Object.Equals静态辅助方法会对值类型对象执行一次装箱操作,损耗系统的性能。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!