4

在微软关于Object.Equals方法(对象)的 MSDN 库文章 ( 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
4

3 回答 3

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);
   }
}
于 2013-07-09T21:55:28.303 回答
0

强制转换. _ 你是对的,该方法也会将其转换为. 这是多余的。objPointPoint.EqualsPoint

于 2013-07-09T21:39:18.250 回答
0

在 Point 类中,我们正在比较类型:

this.GetType().Equals(obj.GetType())

Type Point 不等于 Point3D。

于 2013-07-09T21:39:50.577 回答