摘要:以前写了很多个重写了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
下面给出了一个实例代码:using System;
namespace ConsoleApplication1
{
class ClassA
{
public int _x;
public int _y;
public override int GetHashCode()
{
return (_x+":"+_y).GetHashCode();
}
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;
}
public override string ToString()
{
return _x+":"+_y;
}
static public bool operator == (ClassA x,ClassA y)
{
return object.Equals(x,y);
}
static public bool operator != (ClassA x,ClassA y)
{
return !object.Equals(x,y);
}
//如果下面的不提供,那么编译器会给出警告
static public bool operator == (ClassA x,object y)
{
return object.Equals(x,y);
}
static public bool operator != (ClassA x,object y)
{
return !object.Equals(x,y);
}
static public bool operator == (object x,ClassA y)
{
return object.Equals(x,y);
}
static public bool operator != (object x,ClassA y)
{
return !object.Equals(x,y);
}
}
struct ValueA
{
public int _x;
public int _y;
public......[
阅读全文]