在Microsoft的MSDN Library中有关Object.Equals
方法(对象),(http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx)的文章中,提供了一个示例来演示如何重写Equals。它看起来像这样:
class Point
{
... // IEquatable<Point> is not implemented.
public override bool Equals(Object obj)
{
//Check for null and compare run-time types.
if ((obj == null) || ! this.GetType().Equals(obj.GetType())) {
return false;
}
else {
Point p = (Point) obj;
return (x == p.x) && (y == p.y);
}
}
}
sealed class Point3D: Point
{
int z;
public override bool Equals(Object obj)
{
Point3D pt3 = obj as Point3D;
if (pt3 == null)
return false;
else
return base.Equals((Point)obj) && z == pt3.z; // Here!!!
}
}
在随后的文件中,我注意到以下陈述。
(如果它是Point3D
对象,则强制转换到Point
对象并传递给Equals
的基类实现。)
在这里,return base.Equals((Point)obj)
为什么要将obj投入Point
?
我想这可能只是一个错字,因为我检查.NET 4.0版本文档,它是一个单行:
return base.Equals(obj) && z == ((Point3D)obj).z
答案 0 :(得分:1)
当需要进行等式检查时,今天的建议是实现IEquatable<T>
通用接口。它的Equals(T)
方法提供了类型安全性,避免了值类型的装箱/拆箱开销。
如果Point
类实现了IEquatable<Point>
接口,则它将包含Equals(Point)
方法重载,与Equals(Object)
相比,调用效率更高。一个合理的理由可能是,Point
的类型转换是先发制人的,以防所述接口实现。
class Point : IEquatable<Point>
{
public Equals(Point other)
{
return other != null && this.x == other.x && this.y == other.y;
}
public override bool Equals(Object obj)
{
return this.Equals(obj as Point);
}
}
答案 1 :(得分:0)
没有意义(哈哈)将obj
投射到Point
。你是对的,Point.Equals
方法也将它转换为Point
。这是多余的。
答案 2 :(得分:0)
在Point类中,我们正在比较类型:
this.GetType().Equals(obj.GetType())
Type Point不等于Point3D。