以前写了很多个重写了Equals的类,

通常我比较它们,都是先看看类型是否符合,然后再看成员的意义是否一致。

例如
public override bool Equals(object obj)
{
 ClassA a=obj as ClassA;
 if(a==null)
  return false;

 return this._x==a._x&&this._y==a._y;
}

这个Equals往往用在一些容器里,例如ArrayList.IndexOf之类的。它们使用object.Equals(object obj1,object obj2)来判断对象是否相等

在这些方法的使用上,大多数情况都是直接查询该对象都是引用相同的。

也就是说,上面代码的比较实在太慢了。

那是不是应该加上 if(obj==(object)this) 呢?

我想应该不太需要。 因为在 object.Equals(obj1,obj2) 里,第一步是直接判断引用是否相同的。

我也觉得像 mya.Equals( b ) 这样直接调用Equals方法的情况不多。

(当然上面说的对于ValueType也是有效的。因为装了箱的Value的方法能直接被调用。)

关于重载 == 和 != ,ValueType和RefType的处理方法是不同的。

ValueType如果不重载==/!=操作符号,是不能使用这些符号的。
而RefType则默认用“引用相等”来判断两对象是否相同。

对于RefType我个人意见就是尽量使用object.Equals(obja,objb)来完成,

而对于ValueType,我则喜欢用重载了的Equals

下面给出了一个实例代码: