下列规则概述了实现 Equals 方法与等式操作符(==)的指南:
- 只要你实现了 Equals 方法,就要实现 GetHashCode 方法。这样做能够保持 Equals 与 GetHashCode 是同步的。
- 只要你实现了等式操作符(==),就要重载 Equals 方法,并且让它们做相同的事情。这样做允许架构代码(如 Hashtable 与 ArrayList)使用 Equals 方法并且以使用等式操作符所编写的用户代码一样的方式来运作。
- 在你实现 ICompare 接口的任何时候重载 Equals 方法。
- 考虑在你实现 IComparable 的时候为等式(==)、不等(!=)、小于(<),以及大于(>)操作符实现操作符重载。
- 不要从 Equals 方法或者 GetHashCode 方法或者等式操作符(==)那里抛出异常。
关于 Equals 方法的相关信息,请参考:[实现 Equals 方法]。
为值类型实现等式操作符(==)
大部分的编程语言都没有为值类型的等式操作符(==)而提供默认的实现。因此,在任何必要的时候你都应该重载等式操作符(==)。
你应该考虑为值类型实现 Equals 方法,因为 System.ValueType 的默认实现并不会完成你的自定义实现。
在你重载 Equals 方法的任何时候实现等式操作符(==)的重载。
为引用类型而实现等式操作符(==)
大部分的编程语言都为引用类型而提供了一个默认的等式操作符(==)实现。因此,你在为引用类型而实现等式操作符(==)的时候就应该谨慎地使用。对于大部分的引用类型,即使是那些实现了 Equals 方法的引用类型,也都不应该重载等式操作符(==)。
如果你的类型与基本类型(如 Point、String、BigNumber,以及等等)一样,那么重载等式操作符(==)。在你考虑重载加法(+)和减法(-)操作符的任何时候,你同样应该考虑重载等式操作符(==)。