本文将介绍的是C#中相等运算符重载可能造成的陷阱,希望本文对大家日常的.NET开发工作有所帮助。

本文将对作者开发过程中,碰到的C#中持平运算符重载或许形成的圈套问题。经过对这一圈套的处理,能让我们对持平运算符重载有更深的了解。

详解C#中持平运算符重载或许形成的圈套(C# 运算符重载)  C# 第1张

最近编程时遇到一个持平运算符重载的问题,想来该是C#的一个圈套。

我界说的Coordinate类原先是这样重载持平运算符的:

  1. publiceclassCoordinates
  2. {
  3. ....
  4. publicoverrideboolEquals(objectobj)
  5. {
  6. if(!(objisCoordinates))returnfalse;
  7. Coordinatesother=(Coordinates)obj;
  8. return(this.longitude.CompareTo(other.longitude)==0)&&(this.latitude.CompareTo(other.latitude)==0);
  9. }
  10. publicstaticbooloperator==(Coordinateslhs,Coordinatesrhs)
  11. {
  12. returnlhs.Equals(rhs);
  13. }
  14. publicstaticbooloperator!=(Coordinateslhs,Coordinatesrhs)
  15. {
  16. return!(lhs==rhs);
  17. }
  18. ...
  19. }

这也是运算符重载经常见的状况,但在详细运用时有种状况下会出现问题:即当一个Coordinate目标本身为NULL,而它再与NULL比较时,如下所示:

  1. CoordinatesactualPos=null
  2.    if(actualPos==null)
  3. {。。。}
  4. else
  5. {。。。}

运行时就会抛出过错,提示说某个指针为空。盯梢的成果发现便是承载的“==”运算符出现问题,它会调用“lhs.Equals(rhs)”句子,成果便是lhs本身不存在导致反常。

为此我企图在调用该句子前扫除这种状况,所以把重载函数改为:

  1. publicstaticbooloperator==(Coordinateslhs,Coordinatesrhs)
  2. {
  3. if(lhs==null)return(rhs==null);
  4. returnlhs.Equals(rhs);
  5. }

成果发现这个函数会持续调用本身,随后依然是出现反常。

要处理这个问题,就必须打破这样的死循环,所以尝试着把lhs映射为object,如下所示:

  1. publicstaticbooloperator==(Coordinateslhs,Coordinatesrhs)
  2. {
  3. if((lhsasobject)==null)return((rhsasobject)==null);
  4. returnlhs.Equals(rhs);
  5. }

lhs被映射为object后的“==”就会选用object的持平运算符,成果天然OK。这样的问题信任运用C#编程迟早会遇到,或许还不可思议,期望以上文章对我们有用。

原文标题:C#持平运算符重载的圈套和处理办法

链接:http://www.cnblogs.com/cruisoring/archive/2009/11/04/1595958.html

转载请说明出处
知优网 » 详解C#中持平运算符重载或许形成的圈套(C# 运算符重载)

发表评论

您需要后才能发表评论