下面的规则概括了 Equals 方法和等号运算符 (==) 的实现指南:
每当实现 Equals 方法时都实现 GetHashCode 方法。这可以使 Equals 和 GetHashCode 保持同步。
每当实现 == 时都重写 Equals 方法,并让它们做相同的事情。这允许使用 Equals 方法的结构代码(如 Hashtable 和 ArrayList)的行为与用 == 编写的用户代码相同。
每当实现 IComparable 接口时都重写 Equals 方法。
实现 IComparable 时,应考虑实现相等 (==)、不相等 (!=)、小于 (<) 和大于 (>) 运算符的运算符重载。
不要从 Equals 或 GetHashCode 方法或相等运算符 (==) 引发异常。
有关 Equals 方法的相关信息,请参见实现 Equals 方法。
在值类型上实现相等运算符 (==)
大多数编程语言中没有用于值类型的默认相等运算符 (==) 实现。因此,任何时候只要相等有意义就应该重载 ==。
应考虑在值类型上实现 Equals 方法,这是因为 System.ValueType 的默认实现不会同时执行自定义实现。
每当重载 Equals 方法时都实现 ==。
在引用类型上实现相等运算符 (==)
大多数语言确实为引用类型提供默认的相等运算符 (==) 实现。因此,在引用类型上实现 == 时应小心。大多数引用类型(即使是实现 Equals 方法的那些)都不应该重写 ==。
如果类型是 Point、String、BigNumber 这样的基类型,则重写 ==。每当考虑重载加法 (+) 和减法 (-) 运算符时,也应该考虑重载 ==。