对象判等和重载==操作符

一直以来在实现对象判等时,写完Equals方法之后习惯性地重载==和!=操作符,如下,

代码一:

 

 1           ///   <summary>
 2           ///  重载相等操作符
 3           ///   </summary>
 4           public   static   bool   operator   == (MyObject lhs, MyObject rhs)
 5          {
 6               return  lhs.Equals(rhs);
 7          }
 8           ///   <summary>
 9           ///  重载不等操作符
10           ///   </summary>
11           public   static   bool   operator   != (MyObject lhs, MyObject rhs)
12          {
13               return   ! (lhs.Equals(rhs));
14          }
15 

 最近突然发现这种写法有个隐患,在于我们在对对象进行操作之前,会先判断对象是否为null,

代码二:

1         if  (myobject ==   null )
2        {
3            // do something
4        }
5 

 这时如果myobject真的为null的话,由于!=操作符最终要调用当前对象的Equals方法,会在代码一的第6行引发经典错误:

“未将对象引用设置到对象的实例。”

 查了一下《Programming C#》,发现重载==操作符应该调用Object类的Equals静态方法,相应的!=也是调用==然后取反:

代码四:

 1           ///   <summary>
 2           ///  重载相等操作符
 3           ///   </summary>
 4           public   static   bool   operator   == (MyObject lhs, MyObject rhs)
 5          {
 6               return  Object.Equals(lhs,rhs); // 调用Object类的Equals方法
 7          }
 8           ///   <summary>
 9           ///  重载不等操作符
10           ///   </summary>
11           public   static   bool   operator   != (MyObject lhs, MyObject rhs)
12          {
13               return   ! (lhs  ==  rhs); // 调用==,取反
14          }

Object类的静态 Equals方法如下:

代码五:

 1           public   static  Boolean Equals(Object objA, Object objB)
 2          {
 3               // 如果objA和objB指向的是同一个对象,返回true。包括null == null的情况。
 4               if  (objA  ==  objB)  return   true ;
 5               // 如果objA和objB有一个为null,返回false。
 6               if  ((objA  ==   null ||  (objB  ==   null ))  return   false ;
 7               // 调用Equals方法判等。
 8               return  objA.Equals(objB);
 9          }

分析其代码可知,该方法可以处理myobject为null的情况。

因此在重载==操作符时,不应调用当前类的Equals()方法,而要调用Object.Equals(object objA,object objB)静态方法。


 

转载于:https://www.cnblogs.com/Athos/archive/2008/09/11/1250996.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值