本文将介绍的是C#中相等运算符重载可能造成的陷阱,希望本文对大家日常的.NET开发工作有所帮助。
本文将对作者开发过程中,碰到的C#中持平运算符重载或许形成的圈套问题。经过对这一圈套的处理,能让我们对持平运算符重载有更深的了解。
最近编程时遇到一个持平运算符重载的问题,想来该是C#的一个圈套。
我界说的Coordinate类原先是这样重载持平运算符的:
- publiceclassCoordinates
- {
- ....
- publicoverrideboolEquals(objectobj)
- {
- if(!(objisCoordinates))returnfalse;
- Coordinatesother=(Coordinates)obj;
- return(this.longitude.CompareTo(other.longitude)==0)&&(this.latitude.CompareTo(other.latitude)==0);
- }
- publicstaticbooloperator==(Coordinateslhs,Coordinatesrhs)
- {
- returnlhs.Equals(rhs);
- }
- publicstaticbooloperator!=(Coordinateslhs,Coordinatesrhs)
- {
- return!(lhs==rhs);
- }
- ...
- }
这也是运算符重载经常见的状况,但在详细运用时有种状况下会出现问题:即当一个Coordinate目标本身为NULL,而它再与NULL比较时,如下所示:
- CoordinatesactualPos=null;
- if(actualPos==null)
- {。。。}
- else
- {。。。}
运行时就会抛出过错,提示说某个指针为空。盯梢的成果发现便是承载的“==”运算符出现问题,它会调用“lhs.Equals(rhs)”句子,成果便是lhs本身不存在导致反常。
为此我企图在调用该句子前扫除这种状况,所以把重载函数改为:
- publicstaticbooloperator==(Coordinateslhs,Coordinatesrhs)
- {
- if(lhs==null)return(rhs==null);
- returnlhs.Equals(rhs);
- }
成果发现这个函数会持续调用本身,随后依然是出现反常。
要处理这个问题,就必须打破这样的死循环,所以尝试着把lhs映射为object,如下所示:
- publicstaticbooloperator==(Coordinateslhs,Coordinatesrhs)
- {
- if((lhsasobject)==null)return((rhsasobject)==null);
- returnlhs.Equals(rhs);
- }
lhs被映射为object后的“==”就会选用object的持平运算符,成果天然OK。这样的问题信任运用C#编程迟早会遇到,或许还不可思议,期望以上文章对我们有用。
原文标题:C#持平运算符重载的圈套和处理办法
链接:http://www.cnblogs.com/cruisoring/archive/2009/11/04/1595958.html
转载请说明出处
知优网 » 详解C#中持平运算符重载或许形成的圈套(C# 运算符重载)
知优网 » 详解C#中持平运算符重载或许形成的圈套(C# 运算符重载)