以前写了很多个重写了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
下面给出了一个实例代码: