一、比较引用类型对象的相等性
1.ReferenceEquals()方法
ReferenceEquals()方法一个静态方法,测试两个引用是否引用类的同一个实例,特别是两个引用是否包含内存中的相同地址。作为静态方法,它不能重写,所以system.Object的实现代码保持不变。如果提供的两个引用引用同一个对象实例,则RcfcrenceEqualsO总是返回 tue;否则就返回 false。但是它认为null等于null.
2.虚拟的Equals方法
Equals()虚拟版本的System.Object实现代码也可以比较引用。但因为这个方法是虚拟的,所以可以在自己的类中重写它,从而按值来比较对象。特别是如果希望类的实例用作字典中的键,就需要重写这个方法,以比较相关值。否则,根据重写Object.GetHashCode()的方式,包含对象的字典类要么不工作,要么工作的效率非常低。在重写EqualsO 方法时要注意,重写的 代码不会抛出异常。同理,这是因为如果抛出异常,字典类就会出问题,一些在内部调用这个方法的.NET基类也可能出问题。
3.静态的Equals方法
Equals()的静态版本与其虚拟实例版本的作用相同,其区别是静态版本带有两个参数,并对它们进行相等性比较。这个方法可以处理两个对象中有一个是 null的情况,因此,如果 一个对象可能是null,这个方法就可以抛出异常,提供额外的保护。静态重载版本首先要检查它传递的引用是否为null。如果它们都是null ,就返回true(因为null与null相等)。如果只有一个引用是null.它就返回false。如果两个引用实际上引用了某个对象,它就调用Equals()的虚拟实例版本。这表示在重写Equals()的 实例版本时,其 效果相当于也 重写了静态版本。
4.比较运算符(==)
最好将比较运算符看作严格的值比较和严格的引用比较之间的中间选项。
二、比较值类型对象的相等性
重写Equals()方法,其实System.VolueType提供了Equals()默认重写可以应付绝大多数自定义的结构。