Equals方法
正确实现一个equals方法
1、 如果obj参数为null, 就返回false, 因为在调用非静态的equals方法时,this所标示的当前对象显然不为null。
2、 如果this和obj参数应用的是不同类型的对象,就返回false。显然,判断一个string对象是否等于一个filestream对象时,结果应该是false。
3、 针对类型定义的每个实例字段,将this对象中的值与obj对象中的进行比较。任何字段不相等,就返回false。
4、 调用基类的equals 方法,一边比较它定义的任何字段。如果基类的equals方法返回,就返回false;否则返回true。
publicBoolean Equals (Object obj)
{
// 要比较的对象不能为null
if (obj == null) return false;
// 如果对象属于不同的对象,则肯定不相等
if (this.GetType() != obj.GetType()) returnfalse;
// 如果对象属于相同的类型,那么在它们的所有字段都匹配的前提下返回true
// 由于System.Object没有定义任何字段,所以字段是匹配的
return true;
}
检查同一性应使用Object提供的ReferenceEquals这个静态的方法,原型如下:
public static BooleanReferenceEquals(Object objA, Object objB)
{
return(objA== objB);
}
自定义类型相等性的4个特征:
1、 equals 必须是自反的;换言之,x.Equals(x)肯定返回true。
2、 Equals必须是对称的;换言之,x.Equals(y)肯定返回与y.Equals(x)相同的值。
3、 Equals必须是可传递的;换言之,如果x.Equals(y)返回true,y.Equals(z)返回true,那么x.Equals(z)也肯定返回true。
4、 Equals必须是一致的。尚若比较的两个值没有发生改变,那么Equals应该始终返回true或false。
实现Equals方法其他的事情:
1、 让类型实现System.IEquatable<T>接口的Equals方法,这个泛型接口允许我们定义一个类型安全的Equals方法。通常,实现的Equals方法应该获取一个Object参数,以便在内部调用类型安全的Equals方法。
2、 覆盖==和!=操作符方法,通常,应实现这些操作符方法,并在内部调用类型安全的Equals方法。
3、 实现GetHashCode方法,原因,同一对象的哈希码应该是相同的。