重写Object.Equals方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
重写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静态辅助⽅法会对值类型对象执⾏⼀次装箱操作,损耗系统的性能。