MSDN代码示例:为什么在调用base.Equals(object)之前进行转换?

时间:2013-07-09 21:35:25

标签: c# equals equality

在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

3 个答案:

答案 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。