说起.NET中的类,本是同根生,一点不为过。因为CLR要求所有类都要继承自System.Object。所有对象都必须提供一组通用操作,包括对象的等值性、唯一性、散列码以及克隆。
一、等值性——Equals()方法
有时候我们需要比较两个对象是否相等,比如在一个ArrayList中进行排序查找等操作时。
System.Object提供了Equals()虚方法:
class Object
{
public virtual Boolean Equals(object o)
{
if (this == o) return true;
else return false;
}
}
这种判断方式非常简单:直接比较是两个引用是否指向的是同一对象。但这样比较是不确切的。所以我们需要重写该方法,提供更合适的实现方式。
重写时Equals()四大原则:
- 自反。即x.Equals(x)必须为true。
- 对称。即x.Equals(y)和y.Equals(x)必须返回同样的值。
- 可传递。即如果x.Equals(y)和y.Equals(z)都返回true,则x.Equals(z)也返回true。
- 前后一致。如果两个对象的值没变,那么多次比较的值都应该是相同的。
重写思路
- 1. 如果参数obj为null,返回false。因为在非静态方法中,使用this表示的当前对象肯定不是Null。
- 2. 如果this和obj参数指向同一实例对象,返回true。 这样省略字段比对过程,提高性能。
- 3. 如果this 和obj参数指向的对象类型不同,则返回false。
- 4. 比较this和obj中每个实例字段,如果字段不相等则返回false。
- 5. 调用基类的Equals方法,如果调用结果为false,则返回false;
- 6. 至此,才能返回true。