本文将对作者开发过程中碰到的C#中相等运算符重载可能造成的陷阱问题通过对这一陷阱的解决能让大家对相等运算符重载有更深的了解
最近编程时遇到一个相等运算符重载的问题想来该是C#的一个陷阱
我定义的Coordinate类原先是这样重载相等运算符的
publice class Coordinates
{
public override bool Equals(object obj)
{
if (!(obj is Coordinates)) return false;
Coordinates other = (Coordinates)obj;
return (thislongitudeCompareTo(otherlongitude) == ) && (thislatitudeCompareTo(otherlatitude) == );
}
public static bool operator ==(Coordinates lhs Coordinates rhs)
{
return lhsEquals(rhs);
}
public static bool operator !=(Coordinates lhs Coordinates rhs)
{
return !(lhs == rhs);
}
}
这也是运算符重载时常见的情况但在具体使用时有种情况下会出现问题即当一个Coordinate对象本身为NULL而它再与NULL比较时如下所示
Coordinates actualPos = null
if (actualPos == null)
{
}
else
{
}
运行时就会抛出错误提示说某个指针为空跟蹤的结果发现就是承载的==运算符出现问题它会调用lhsEquals(rhs)语句结果就是lhs本身不存在导致异常
为此我试图在调用该语句前排除这种情况于是把重载函数改为
public static bool operator ==(Coordinates lhs Coordinates rhs)
{
if (lhs == null) return (rhs == null);
return lhsEquals(rhs);
}
结果发现这个函数会继续调用自身随后依然是出现异常
要解决这个问题就必须打破这样的死循环于是尝试着把lhs映射为object如下所示
public static bool operator ==(Coordinates lhs Coordinates rhs)
{
if ((lhs as object) == null) return ((rhs as object) == null);
return lhsEquals(rhs);
}
lhs被映射为object后的==就会采用object的相等运算符结果自然OK这样的问题相信使用C#编程迟早会遇到可能还莫名其妙希望以上文章对大家有用